diff --git a/.cloudbuild/samples_build.yaml b/.cloudbuild/samples_build.yaml new file mode 100644 index 0000000000..c22f133517 --- /dev/null +++ b/.cloudbuild/samples_build.yaml @@ -0,0 +1,35 @@ +steps: +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: ls + args: [ + '-alt', + ] +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: curl + args: [ + '--header', + 'Metadata-Flavor: Google', + 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/email' + ] +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: pwd +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: bash + args: [ + '.kokoro/build.sh' + ] + env: + - 'JOB_TYPE=samples' + - 'GOOGLE_CLOUD_PROJECT=cloud-java-ci-sample' + - 'GOOGLE_CLOUD_PROJECT_NUMBER=615621127317' + - 'IT_SERVICE_ACCOUNT_EMAIL=samples@cloud-java-ci-sample.iam.gserviceaccount.com' +- name: gcr.io/cloud-devrel-public-resources/java8 + entrypoint: echo + args: [ + 'Sample job succeeded', + ] +timeout: 3600s +options: + defaultLogsBucketBehavior: REGIONAL_USER_OWNED_BUCKET + + diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index bf48c82da1..6983bb2634 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -13,5 +13,5 @@ # limitations under the License. docker: image: gcr.io/cloud-devrel-public-resources/owlbot-java:latest - digest: sha256:0d1bb26a1a99ae0456176bf891b8490e9aab424a5cb4e4d301d9703c4dc43b58 -# created: 2024-01-30T19:46:55.029238294Z + digest: sha256:25b384ee1674eda3984ec41c15b514a63bbeb5eda4d57c73c7e6f5adef2fd2f1 +# created: 2024-04-05T19:12:34.133475268Z diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index e5e9b068b6..b7ee2ca7d2 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -17,6 +17,6 @@ jobs: # repository .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@unmanaged-dependencies-check-latest + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.29.0 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/.kokoro/presubmit/graalvm-native-17.cfg b/.kokoro/presubmit/graalvm-native-17.cfg index b3873194b1..7c1a9bb67b 100644 --- a/.kokoro/presubmit/graalvm-native-17.cfg +++ b/.kokoro/presubmit/graalvm-native-17.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.28.1" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.29.0" } env_vars: { diff --git a/.kokoro/presubmit/graalvm-native.cfg b/.kokoro/presubmit/graalvm-native.cfg index 46b04f3c18..39055d62da 100644 --- a/.kokoro/presubmit/graalvm-native.cfg +++ b/.kokoro/presubmit/graalvm-native.cfg @@ -3,7 +3,7 @@ # Configure the docker image for kokoro-trampoline. env_vars: { key: "TRAMPOLINE_IMAGE" - value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.28.1" + value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.29.0" } env_vars: { diff --git a/.readme-partials.yaml b/.readme-partials.yaml index c95759f5b2..ab591da18a 100644 --- a/.readme-partials.yaml +++ b/.readme-partials.yaml @@ -1,4 +1,10 @@ custom_content: | + ## About Storage Control + + The [Storage Control API](https://cloud.google.com/storage/docs/reference/rpc/) lets you perform metadata-specific, control plane, and long-running operations. + + The Storage Control API creates one space to perform metadata-specific, control plane, and long-running operations apart from the Storage API. Separating these operations from the Storage API improves API standardization and lets you run faster releases. + #### Creating an authorized service object To make authenticated requests to Google Cloud Storage, you must create a service object with credentials. You can diff --git a/.repo-metadata.json b/.repo-metadata.json index a9b3a810bc..e37a0cdb0c 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -15,5 +15,6 @@ "requires_billing": true, "library_type": "GAPIC_COMBO", "extra_versioned_modules": "gapic-google-cloud-storage-v2", - "excluded_poms": "google-cloud-storage-bom,google-cloud-storage" + "excluded_poms": "google-cloud-storage-bom,google-cloud-storage", + "recommended_package": "com.google.cloud.storage" } diff --git a/CHANGELOG.md b/CHANGELOG.md index aba99a0b0b..47ad7b8cb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## [2.37.0](https://github.com/googleapis/java-storage/compare/v2.36.1...v2.37.0) (2024-04-19) + + +### Features + +* Adds a ZeroCopy response marshaller for grpc ReadObject handling ([#2489](https://github.com/googleapis/java-storage/issues/2489)) ([8c7404d](https://github.com/googleapis/java-storage/commit/8c7404dea8ef16a7b61accad4fe614e033a5ad2c)) +* Port BufferToDiskThenUpload to work with HttpStorageOptions ([#2473](https://github.com/googleapis/java-storage/issues/2473)) ([d84e255](https://github.com/googleapis/java-storage/commit/d84e25559afecc27026c7f4fe7aeaf0d0ce705b4)) +* Port DefaultBlobWriteSessionConfig to work with HttpStorageOptions ([#2472](https://github.com/googleapis/java-storage/issues/2472)) ([e5772a4](https://github.com/googleapis/java-storage/commit/e5772a4f4ec5d747fcd403477a35ceeb94492280)) +* Port ParallelCompositeUploadBlobWriteSessionConfig to work with HttpStorageOptions ([#2474](https://github.com/googleapis/java-storage/issues/2474)) ([3bf6026](https://github.com/googleapis/java-storage/commit/3bf60264f47aad8101bb4b4cff9cc0449cf1c4f3)) +* Transfer Manager ParallelCompositeUploads ([#2494](https://github.com/googleapis/java-storage/issues/2494)) ([8b54549](https://github.com/googleapis/java-storage/commit/8b5454910c74563c9598f9d5cc23fa509ec749d9)) + + +### Bug Fixes + +* Ensure all BlobWriteSession types conform to the semantics specified in BlobWriteSession ([#2482](https://github.com/googleapis/java-storage/issues/2482)) ([d47afcf](https://github.com/googleapis/java-storage/commit/d47afcfe2bcb2e7e266a5197456b6f9661e91004)) +* Fix BidiBlobWriteSessionConfigs to respect preconditions ([#2481](https://github.com/googleapis/java-storage/issues/2481)) ([955d78a](https://github.com/googleapis/java-storage/commit/955d78af0fecd4b65506df4bfd44fc683e23c2ec)) +* Update ApiaryUnbufferedWritableByteChannel to be graceful of non-quantum aligned write calls ([#2493](https://github.com/googleapis/java-storage/issues/2493)) ([f548335](https://github.com/googleapis/java-storage/commit/f5483356a3ba6327a712ef2f5534b61a649174df)) +* Update BidiBlobWriteSessionConfig to respect a provided bufferSize ([#2471](https://github.com/googleapis/java-storage/issues/2471)) ([e1fb857](https://github.com/googleapis/java-storage/commit/e1fb8577e6b7a36981fb78937fe8c5dd606a4c2a)) +* Update grpc handling of IAM Policy etag to account for base64 encoding ([#2499](https://github.com/googleapis/java-storage/issues/2499)) ([032f2f2](https://github.com/googleapis/java-storage/commit/032f2f2693c6c75cc4ae0339be805c0bb94fa064)) +* Update Grpc Retry Conformance after new additions to testbench ([#2309](https://github.com/googleapis/java-storage/issues/2309)) ([09043c5](https://github.com/googleapis/java-storage/commit/09043c5587ae9e6adeb425f5c2f7c4f65ec5e20e)) + + +### Dependencies + +* Update dependency com.google.apis:google-api-services-storage to v1-rev20240319-2.0.0 ([#2460](https://github.com/googleapis/java-storage/issues/2460)) ([9c2ee90](https://github.com/googleapis/java-storage/commit/9c2ee909d02fef5afc201589f5ced4062e2f14e8)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.28.1 ([#2467](https://github.com/googleapis/java-storage/issues/2467)) ([c12f329](https://github.com/googleapis/java-storage/commit/c12f3290a029c25cdac458cda44835c0a43c33e7)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.29.0 ([#2502](https://github.com/googleapis/java-storage/issues/2502)) ([7ed8446](https://github.com/googleapis/java-storage/commit/7ed8446dcbff165408331df97e2d15a1cd70b7be)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.43.0 ([#2459](https://github.com/googleapis/java-storage/issues/2459)) ([2dc4748](https://github.com/googleapis/java-storage/commit/2dc4748353be4fe06ec7df2e413ed5752d350f8b)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.44.0 ([#2497](https://github.com/googleapis/java-storage/issues/2497)) ([9b0253c](https://github.com/googleapis/java-storage/commit/9b0253ca1a03d6a90a1008794b00c6825d26ff0c)) + + +### Documentation + +* Add summary and reference docs for Storage Control API to readme ([#2485](https://github.com/googleapis/java-storage/issues/2485)) ([70fd088](https://github.com/googleapis/java-storage/commit/70fd088975280ed9a650ca09825ccb28297d89f7)) +* Create Samples for transfer manager ([#2492](https://github.com/googleapis/java-storage/issues/2492)) ([e2030b2](https://github.com/googleapis/java-storage/commit/e2030b281d45b69840962e0a80c4b6b85e300b20)) + ## [2.36.1](https://github.com/googleapis/java-storage/compare/v2.36.0...v2.36.1) (2024-03-20) diff --git a/README.md b/README.md index 9e0ad82fd4..9007e34e31 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud libraries-bom - 26.34.0 + 26.37.0 pom import @@ -31,6 +31,10 @@ If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: com.google.cloud google-cloud-storage + + com.google.cloud + google-cloud-storage-control + ``` @@ -42,7 +46,12 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage - 2.36.0 + 2.36.1 + + + com.google.cloud + google-cloud-storage-control + 2.37.0 ``` @@ -50,20 +59,20 @@ If you are using Maven without the BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.34.0') +implementation platform('com.google.cloud:libraries-bom:26.37.0') implementation 'com.google.cloud:google-cloud-storage' ``` If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-storage:2.36.0' +implementation 'com.google.cloud:google-cloud-storage:2.36.1' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.36.0" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.36.1" ``` @@ -99,6 +108,12 @@ See the [Cloud Storage client library docs][javadocs] to learn how to use this Cloud Storage Client Library. +## About Storage Control + +The [Storage Control API](https://cloud.google.com/storage/docs/reference/rpc/) lets you perform metadata-specific, control plane, and long-running operations. + +The Storage Control API creates one space to perform metadata-specific, control plane, and long-running operations apart from the Storage API. Separating these operations from the Storage API improves API standardization and lets you run faster releases. + #### Creating an authorized service object To make authenticated requests to Google Cloud Storage, you must create a service object with credentials. You can @@ -227,6 +242,7 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/ | Quickstart Grpc Dp Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartGrpcDpSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/QuickstartGrpcDpSample.java) | | Quickstart Grpc Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartGrpcSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/QuickstartGrpcSample.java) | | Quickstart Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/QuickstartSample.java) | +| Quickstart Storage Control Sample | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java) | | Add Bucket Default Owner | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketDefaultOwner.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketDefaultOwner.java) | | Add Bucket Iam Conditional Binding | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamConditionalBinding.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamConditionalBinding.java) | | Add Bucket Iam Member | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamMember.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/bucket/AddBucketIamMember.java) | @@ -331,6 +347,10 @@ Samples are in the [`samples/`](https://github.com/googleapis/java-storage/tree/ | Upload Kms Encrypted Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadKmsEncryptedObject.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/object/UploadKmsEncryptedObject.java) | | Upload Object | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadObject.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/object/UploadObject.java) | | Upload Object From Memory | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java) | +| Download Bucket | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java) | +| Download Many | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java) | +| Upload Directory | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java) | +| Upload Many | [source code](https://github.com/googleapis/java-storage/blob/main/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java) | [![Open in Cloud Shell][shell_img]](https://console.cloud.google.com/cloudshell/open?git_repo=https://github.com/googleapis/java-storage&page=editor&open_in_editor=samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java) | @@ -430,7 +450,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.36.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.36.1 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml index feb43f75a9..1b0ce8da7f 100644 --- a/gapic-google-cloud-storage-v2/pom.xml +++ b/gapic-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 2c33298edc..244967fec6 100644 --- a/google-cloud-storage-bom/pom.xml +++ b/google-cloud-storage-bom/pom.xml @@ -19,12 +19,12 @@ 4.0.0 com.google.cloud google-cloud-storage-bom - 2.36.1 + 2.37.0 pom com.google.cloud sdk-platform-java-config - 3.28.1 + 3.29.0 @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.37.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index 556c235dfb..852c797ba5 100644 --- a/google-cloud-storage-control/pom.xml +++ b/google-cloud-storage-control/pom.xml @@ -5,13 +5,13 @@ 4.0.0 com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0-alpha google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java index 5a782fb283..a25fbd67ee 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlClient.java @@ -184,6 +184,83 @@ * * * + * + *

CreateManagedFolder + *

Creates a new managed folder. + * + *

Request object method variants only take one parameter, a request object, which must be constructed before the call.

+ * + *

"Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

+ * + *

Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

+ * + * + * + * + *

DeleteManagedFolder + *

Permanently deletes an empty managed folder. + * + *

Request object method variants only take one parameter, a request object, which must be constructed before the call.

+ * + *

"Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

+ * + *

Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

+ * + * + * + * + *

GetManagedFolder + *

Returns metadata for the specified managed folder. + * + *

Request object method variants only take one parameter, a request object, which must be constructed before the call.

+ * + *

"Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

+ * + *

Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

+ * + * + * + * + *

ListManagedFolders + *

Retrieves a list of managed folders for a given bucket. + * + *

Request object method variants only take one parameter, a request object, which must be constructed before the call.

+ * + *

"Flattened" method variants have converted the fields of the request object into function parameters to enable multiple ways to call the same method.

+ * + *

Callable method variants take no parameters and return an immutable API callable object, which can be used to initiate calls to the service.

+ * + * + * * * *

See the individual methods for example code. @@ -310,7 +387,10 @@ public final OperationsClient getOperationsClient() { * @param folder Required. Properties of the new folder being created. The bucket and name of the * folder are specified in the parent and folder_id fields, respectively. Populating those * fields in `folder` will result in an error. - * @param folderId Required. The absolute path of the folder, using a single `/` as delimiter. + * @param folderId Required. The full name of a folder, including all its parent folders. Folders + * use single '/' characters as a delimiter. The folder_id must end with a slash. For example, + * the folder_id of "books/biographies/" would create a new "biographies/" folder under the + * "books/" folder. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ public final Folder createFolder(BucketName parent, Folder folder, String folderId) { @@ -347,7 +427,10 @@ public final Folder createFolder(BucketName parent, Folder folder, String folder * @param folder Required. Properties of the new folder being created. The bucket and name of the * folder are specified in the parent and folder_id fields, respectively. Populating those * fields in `folder` will result in an error. - * @param folderId Required. The absolute path of the folder, using a single `/` as delimiter. + * @param folderId Required. The full name of a folder, including all its parent folders. Folders + * use single '/' characters as a delimiter. The folder_id must end with a slash. For example, + * the folder_id of "books/biographies/" would create a new "biographies/" folder under the + * "books/" folder. * @throws com.google.api.gax.rpc.ApiException if the remote call fails */ public final Folder createFolder(String parent, Folder folder, String folderId) { @@ -1117,6 +1200,560 @@ public final UnaryCallable getStorageLay return stub.getStorageLayoutCallable(); } + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]");
+   *   ManagedFolder managedFolder = ManagedFolder.newBuilder().build();
+   *   String managedFolderId = "managedFolderId-2027084056";
+   *   ManagedFolder response =
+   *       storageControlClient.createManagedFolder(parent, managedFolder, managedFolderId);
+   * }
+   * }
+ * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @param managedFolder Required. Properties of the managed folder being created. The bucket and + * managed folder names are specified in the `parent` and `managed_folder_id` fields. + * Populating these fields in `managed_folder` will result in an error. + * @param managedFolderId Required. The name of the managed folder. It uses a single `/` as + * delimiter and leading and trailing `/` are allowed. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder( + BucketName parent, ManagedFolder managedFolder, String managedFolderId) { + CreateManagedFolderRequest request = + CreateManagedFolderRequest.newBuilder() + .setParent(parent == null ? null : parent.toString()) + .setManagedFolder(managedFolder) + .setManagedFolderId(managedFolderId) + .build(); + return createManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   String parent = BucketName.of("[PROJECT]", "[BUCKET]").toString();
+   *   ManagedFolder managedFolder = ManagedFolder.newBuilder().build();
+   *   String managedFolderId = "managedFolderId-2027084056";
+   *   ManagedFolder response =
+   *       storageControlClient.createManagedFolder(parent, managedFolder, managedFolderId);
+   * }
+   * }
+ * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @param managedFolder Required. Properties of the managed folder being created. The bucket and + * managed folder names are specified in the `parent` and `managed_folder_id` fields. + * Populating these fields in `managed_folder` will result in an error. + * @param managedFolderId Required. The name of the managed folder. It uses a single `/` as + * delimiter and leading and trailing `/` are allowed. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder( + String parent, ManagedFolder managedFolder, String managedFolderId) { + CreateManagedFolderRequest request = + CreateManagedFolderRequest.newBuilder() + .setParent(parent) + .setManagedFolder(managedFolder) + .setManagedFolderId(managedFolderId) + .build(); + return createManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   CreateManagedFolderRequest request =
+   *       CreateManagedFolderRequest.newBuilder()
+   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
+   *           .setManagedFolder(ManagedFolder.newBuilder().build())
+   *           .setManagedFolderId("managedFolderId-2027084056")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ManagedFolder response = storageControlClient.createManagedFolder(request);
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder createManagedFolder(CreateManagedFolderRequest request) { + return createManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Creates a new managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   CreateManagedFolderRequest request =
+   *       CreateManagedFolderRequest.newBuilder()
+   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
+   *           .setManagedFolder(ManagedFolder.newBuilder().build())
+   *           .setManagedFolderId("managedFolderId-2027084056")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ApiFuture future =
+   *       storageControlClient.createManagedFolderCallable().futureCall(request);
+   *   // Do something.
+   *   ManagedFolder response = future.get();
+   * }
+   * }
+ */ + public final UnaryCallable + createManagedFolderCallable() { + return stub.createManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]");
+   *   storageControlClient.deleteManagedFolder(name);
+   * }
+   * }
+ * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(ManagedFolderName name) { + DeleteManagedFolderRequest request = + DeleteManagedFolderRequest.newBuilder() + .setName(name == null ? null : name.toString()) + .build(); + deleteManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   String name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString();
+   *   storageControlClient.deleteManagedFolder(name);
+   * }
+   * }
+ * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(String name) { + DeleteManagedFolderRequest request = + DeleteManagedFolderRequest.newBuilder().setName(name).build(); + deleteManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   DeleteManagedFolderRequest request =
+   *       DeleteManagedFolderRequest.newBuilder()
+   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
+   *           .setIfMetagenerationMatch(1043427781)
+   *           .setIfMetagenerationNotMatch(1025430873)
+   *           .setAllowNonEmpty(true)
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   storageControlClient.deleteManagedFolder(request);
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final void deleteManagedFolder(DeleteManagedFolderRequest request) { + deleteManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Permanently deletes an empty managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   DeleteManagedFolderRequest request =
+   *       DeleteManagedFolderRequest.newBuilder()
+   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
+   *           .setIfMetagenerationMatch(1043427781)
+   *           .setIfMetagenerationNotMatch(1025430873)
+   *           .setAllowNonEmpty(true)
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ApiFuture future =
+   *       storageControlClient.deleteManagedFolderCallable().futureCall(request);
+   *   // Do something.
+   *   future.get();
+   * }
+   * }
+ */ + public final UnaryCallable deleteManagedFolderCallable() { + return stub.deleteManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]");
+   *   ManagedFolder response = storageControlClient.getManagedFolder(name);
+   * }
+   * }
+ * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(ManagedFolderName name) { + GetManagedFolderRequest request = + GetManagedFolderRequest.newBuilder().setName(name == null ? null : name.toString()).build(); + return getManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   String name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString();
+   *   ManagedFolder response = storageControlClient.getManagedFolder(name);
+   * }
+   * }
+ * + * @param name Required. Name of the managed folder. Format: + * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(String name) { + GetManagedFolderRequest request = GetManagedFolderRequest.newBuilder().setName(name).build(); + return getManagedFolder(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   GetManagedFolderRequest request =
+   *       GetManagedFolderRequest.newBuilder()
+   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
+   *           .setIfMetagenerationMatch(1043427781)
+   *           .setIfMetagenerationNotMatch(1025430873)
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ManagedFolder response = storageControlClient.getManagedFolder(request);
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ManagedFolder getManagedFolder(GetManagedFolderRequest request) { + return getManagedFolderCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Returns metadata for the specified managed folder. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   GetManagedFolderRequest request =
+   *       GetManagedFolderRequest.newBuilder()
+   *           .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString())
+   *           .setIfMetagenerationMatch(1043427781)
+   *           .setIfMetagenerationNotMatch(1025430873)
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ApiFuture future =
+   *       storageControlClient.getManagedFolderCallable().futureCall(request);
+   *   // Do something.
+   *   ManagedFolder response = future.get();
+   * }
+   * }
+ */ + public final UnaryCallable getManagedFolderCallable() { + return stub.getManagedFolderCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]");
+   *   for (ManagedFolder element : storageControlClient.listManagedFolders(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders(BucketName parent) { + ListManagedFoldersRequest request = + ListManagedFoldersRequest.newBuilder() + .setParent(parent == null ? null : parent.toString()) + .build(); + return listManagedFolders(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   String parent = BucketName.of("[PROJECT]", "[BUCKET]").toString();
+   *   for (ManagedFolder element : storageControlClient.listManagedFolders(parent).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param parent Required. Name of the bucket this managed folder belongs to. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders(String parent) { + ListManagedFoldersRequest request = + ListManagedFoldersRequest.newBuilder().setParent(parent).build(); + return listManagedFolders(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   ListManagedFoldersRequest request =
+   *       ListManagedFoldersRequest.newBuilder()
+   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .setPrefix("prefix-980110702")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   for (ManagedFolder element : storageControlClient.listManagedFolders(request).iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ * + * @param request The request object containing all of the parameters for the API call. + * @throws com.google.api.gax.rpc.ApiException if the remote call fails + */ + public final ListManagedFoldersPagedResponse listManagedFolders( + ListManagedFoldersRequest request) { + return listManagedFoldersPagedCallable().call(request); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   ListManagedFoldersRequest request =
+   *       ListManagedFoldersRequest.newBuilder()
+   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .setPrefix("prefix-980110702")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   ApiFuture future =
+   *       storageControlClient.listManagedFoldersPagedCallable().futureCall(request);
+   *   // Do something.
+   *   for (ManagedFolder element : future.get().iterateAll()) {
+   *     // doThingsWith(element);
+   *   }
+   * }
+   * }
+ */ + public final UnaryCallable + listManagedFoldersPagedCallable() { + return stub.listManagedFoldersPagedCallable(); + } + + // AUTO-GENERATED DOCUMENTATION AND METHOD. + /** + * Retrieves a list of managed folders for a given bucket. + * + *

Sample code: + * + *

{@code
+   * // This snippet has been automatically generated and should be regarded as a code template only.
+   * // It will require modifications to work:
+   * // - It may require correct/in-range values for request initialization.
+   * // - It may require specifying regional endpoints when creating the service client as shown in
+   * // https://cloud.google.com/java/docs/setup#configure_endpoints_for_the_client_library
+   * try (StorageControlClient storageControlClient = StorageControlClient.create()) {
+   *   ListManagedFoldersRequest request =
+   *       ListManagedFoldersRequest.newBuilder()
+   *           .setParent(BucketName.of("[PROJECT]", "[BUCKET]").toString())
+   *           .setPageSize(883849137)
+   *           .setPageToken("pageToken873572522")
+   *           .setPrefix("prefix-980110702")
+   *           .setRequestId("requestId693933066")
+   *           .build();
+   *   while (true) {
+   *     ListManagedFoldersResponse response =
+   *         storageControlClient.listManagedFoldersCallable().call(request);
+   *     for (ManagedFolder element : response.getManagedFoldersList()) {
+   *       // doThingsWith(element);
+   *     }
+   *     String nextPageToken = response.getNextPageToken();
+   *     if (!Strings.isNullOrEmpty(nextPageToken)) {
+   *       request = request.toBuilder().setPageToken(nextPageToken).build();
+   *     } else {
+   *       break;
+   *     }
+   *   }
+   * }
+   * }
+ */ + public final UnaryCallable + listManagedFoldersCallable() { + return stub.listManagedFoldersCallable(); + } + @Override public final void close() { stub.close(); @@ -1219,4 +1856,84 @@ protected ListFoldersFixedSizeCollection createCollection( return new ListFoldersFixedSizeCollection(pages, collectionSize); } } + + public static class ListManagedFoldersPagedResponse + extends AbstractPagedListResponse< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage, + ListManagedFoldersFixedSizeCollection> { + + public static ApiFuture createAsync( + PageContext context, + ApiFuture futureResponse) { + ApiFuture futurePage = + ListManagedFoldersPage.createEmptyPage().createPageAsync(context, futureResponse); + return ApiFutures.transform( + futurePage, + input -> new ListManagedFoldersPagedResponse(input), + MoreExecutors.directExecutor()); + } + + private ListManagedFoldersPagedResponse(ListManagedFoldersPage page) { + super(page, ListManagedFoldersFixedSizeCollection.createEmptyCollection()); + } + } + + public static class ListManagedFoldersPage + extends AbstractPage< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage> { + + private ListManagedFoldersPage( + PageContext context, + ListManagedFoldersResponse response) { + super(context, response); + } + + private static ListManagedFoldersPage createEmptyPage() { + return new ListManagedFoldersPage(null, null); + } + + @Override + protected ListManagedFoldersPage createPage( + PageContext context, + ListManagedFoldersResponse response) { + return new ListManagedFoldersPage(context, response); + } + + @Override + public ApiFuture createPageAsync( + PageContext context, + ApiFuture futureResponse) { + return super.createPageAsync(context, futureResponse); + } + } + + public static class ListManagedFoldersFixedSizeCollection + extends AbstractFixedSizeCollection< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ManagedFolder, + ListManagedFoldersPage, + ListManagedFoldersFixedSizeCollection> { + + private ListManagedFoldersFixedSizeCollection( + List pages, int collectionSize) { + super(pages, collectionSize); + } + + private static ListManagedFoldersFixedSizeCollection createEmptyCollection() { + return new ListManagedFoldersFixedSizeCollection(null, 0); + } + + @Override + protected ListManagedFoldersFixedSizeCollection createCollection( + List pages, int collectionSize) { + return new ListManagedFoldersFixedSizeCollection(pages, collectionSize); + } + } } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java index c7f37fa4ad..d63f5272a9 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/StorageControlSettings.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.core.ApiFunction; import com.google.api.gax.core.GoogleCredentialsProvider; @@ -113,6 +114,29 @@ public UnaryCallSettings getStorageLayou return ((StorageControlStubSettings) getStubSettings()).getStorageLayoutSettings(); } + /** Returns the object with the settings used for calls to createManagedFolder. */ + public UnaryCallSettings + createManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).createManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings deleteManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).deleteManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to getManagedFolder. */ + public UnaryCallSettings getManagedFolderSettings() { + return ((StorageControlStubSettings) getStubSettings()).getManagedFolderSettings(); + } + + /** Returns the object with the settings used for calls to listManagedFolders. */ + public PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return ((StorageControlStubSettings) getStubSettings()).listManagedFoldersSettings(); + } + public static final StorageControlSettings create(StorageControlStubSettings stub) throws IOException { return new StorageControlSettings.Builder(stub.toBuilder()).build(); @@ -248,6 +272,31 @@ public UnaryCallSettings.Builder renameFolderSet return getStubSettingsBuilder().getStorageLayoutSettings(); } + /** Returns the builder for the settings used for calls to createManagedFolder. */ + public UnaryCallSettings.Builder + createManagedFolderSettings() { + return getStubSettingsBuilder().createManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings.Builder + deleteManagedFolderSettings() { + return getStubSettingsBuilder().deleteManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to getManagedFolder. */ + public UnaryCallSettings.Builder + getManagedFolderSettings() { + return getStubSettingsBuilder().getManagedFolderSettings(); + } + + /** Returns the builder for the settings used for calls to listManagedFolders. */ + public PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return getStubSettingsBuilder().listManagedFoldersSettings(); + } + @Override public StorageControlSettings build() throws IOException { return new StorageControlSettings(this); diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json index cafc1e3145..d2d8f4700a 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/gapic_metadata.json @@ -13,18 +13,30 @@ "CreateFolder": { "methods": ["createFolder", "createFolder", "createFolder", "createFolderCallable"] }, + "CreateManagedFolder": { + "methods": ["createManagedFolder", "createManagedFolder", "createManagedFolder", "createManagedFolderCallable"] + }, "DeleteFolder": { "methods": ["deleteFolder", "deleteFolder", "deleteFolder", "deleteFolderCallable"] }, + "DeleteManagedFolder": { + "methods": ["deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolderCallable"] + }, "GetFolder": { "methods": ["getFolder", "getFolder", "getFolder", "getFolderCallable"] }, + "GetManagedFolder": { + "methods": ["getManagedFolder", "getManagedFolder", "getManagedFolder", "getManagedFolderCallable"] + }, "GetStorageLayout": { "methods": ["getStorageLayout", "getStorageLayout", "getStorageLayout", "getStorageLayoutCallable"] }, "ListFolders": { "methods": ["listFolders", "listFolders", "listFolders", "listFoldersPagedCallable", "listFoldersCallable"] }, + "ListManagedFolders": { + "methods": ["listManagedFolders", "listManagedFolders", "listManagedFolders", "listManagedFoldersPagedCallable", "listManagedFoldersCallable"] + }, "RenameFolder": { "methods": ["renameFolderAsync", "renameFolderAsync", "renameFolderAsync", "renameFolderOperationCallable", "renameFolderCallable"] } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java index 3bd55270af..b075a0493e 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlStub.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.BackgroundResource; import com.google.api.gax.core.BackgroundResourceAggregation; @@ -32,12 +33,18 @@ import com.google.longrunning.stub.GrpcOperationsStub; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -109,6 +116,47 @@ public class GrpcStorageControlStub extends StorageControlStub { .setResponseMarshaller(ProtoUtils.marshaller(StorageLayout.getDefaultInstance())) .build(); + private static final MethodDescriptor + createManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/CreateManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(CreateManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(ManagedFolder.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + deleteManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/DeleteManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(DeleteManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(Empty.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + getManagedFolderMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/GetManagedFolder") + .setRequestMarshaller( + ProtoUtils.marshaller(GetManagedFolderRequest.getDefaultInstance())) + .setResponseMarshaller(ProtoUtils.marshaller(ManagedFolder.getDefaultInstance())) + .build(); + + private static final MethodDescriptor + listManagedFoldersMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.UNARY) + .setFullMethodName("google.storage.control.v2.StorageControl/ListManagedFolders") + .setRequestMarshaller( + ProtoUtils.marshaller(ListManagedFoldersRequest.getDefaultInstance())) + .setResponseMarshaller( + ProtoUtils.marshaller(ListManagedFoldersResponse.getDefaultInstance())) + .build(); + private final UnaryCallable createFolderCallable; private final UnaryCallable deleteFolderCallable; private final UnaryCallable getFolderCallable; @@ -119,6 +167,14 @@ public class GrpcStorageControlStub extends StorageControlStub { private final OperationCallable renameFolderOperationCallable; private final UnaryCallable getStorageLayoutCallable; + private final UnaryCallable + createManagedFolderCallable; + private final UnaryCallable deleteManagedFolderCallable; + private final UnaryCallable getManagedFolderCallable; + private final UnaryCallable + listManagedFoldersCallable; + private final UnaryCallable + listManagedFoldersPagedCallable; private final BackgroundResource backgroundResources; private final GrpcOperationsStub operationsStub; @@ -136,6 +192,14 @@ public class GrpcStorageControlStub extends StorageControlStub { PathTemplate.create("{bucket=projects/*/buckets/*}/**"); private static final PathTemplate GET_STORAGE_LAYOUT_0_PATH_TEMPLATE = PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate CREATE_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=**}"); + private static final PathTemplate DELETE_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate GET_MANAGED_FOLDER_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=projects/*/buckets/*}/**"); + private static final PathTemplate LIST_MANAGED_FOLDERS_0_PATH_TEMPLATE = + PathTemplate.create("{bucket=**}"); public static final GrpcStorageControlStub create(StorageControlStubSettings settings) throws IOException { @@ -277,6 +341,82 @@ protected GrpcStorageControlStub( return requestBuilder.build(); }) .build(); + GrpcCallSettings + createManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(createManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + request.getParent(), "bucket", CREATE_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + CreateManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings deleteManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(deleteManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add(request.getName(), "bucket", DELETE_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + DeleteManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings getManagedFolderTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(getManagedFolderMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add(request.getName(), "bucket", GET_MANAGED_FOLDER_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + GetManagedFolderRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); + GrpcCallSettings + listManagedFoldersTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(listManagedFoldersMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + builder.add( + request.getParent(), "bucket", LIST_MANAGED_FOLDERS_0_PATH_TEMPLATE); + return builder.build(); + }) + .setRequestMutator( + request -> { + ListManagedFoldersRequest.Builder requestBuilder = request.toBuilder(); + if (Strings.isNullOrEmpty(request.getRequestId())) { + requestBuilder.setRequestId(UUID.randomUUID().toString()); + } + return requestBuilder.build(); + }) + .build(); this.createFolderCallable = callableFactory.createUnaryCallable( @@ -305,6 +445,29 @@ protected GrpcStorageControlStub( this.getStorageLayoutCallable = callableFactory.createUnaryCallable( getStorageLayoutTransportSettings, settings.getStorageLayoutSettings(), clientContext); + this.createManagedFolderCallable = + callableFactory.createUnaryCallable( + createManagedFolderTransportSettings, + settings.createManagedFolderSettings(), + clientContext); + this.deleteManagedFolderCallable = + callableFactory.createUnaryCallable( + deleteManagedFolderTransportSettings, + settings.deleteManagedFolderSettings(), + clientContext); + this.getManagedFolderCallable = + callableFactory.createUnaryCallable( + getManagedFolderTransportSettings, settings.getManagedFolderSettings(), clientContext); + this.listManagedFoldersCallable = + callableFactory.createUnaryCallable( + listManagedFoldersTransportSettings, + settings.listManagedFoldersSettings(), + clientContext); + this.listManagedFoldersPagedCallable = + callableFactory.createPagedCallable( + listManagedFoldersTransportSettings, + settings.listManagedFoldersSettings(), + clientContext); this.backgroundResources = new BackgroundResourceAggregation(clientContext.getBackgroundResources()); @@ -355,6 +518,33 @@ public UnaryCallable getStorageLayoutCal return getStorageLayoutCallable; } + @Override + public UnaryCallable createManagedFolderCallable() { + return createManagedFolderCallable; + } + + @Override + public UnaryCallable deleteManagedFolderCallable() { + return deleteManagedFolderCallable; + } + + @Override + public UnaryCallable getManagedFolderCallable() { + return getManagedFolderCallable; + } + + @Override + public UnaryCallable + listManagedFoldersCallable() { + return listManagedFoldersCallable; + } + + @Override + public UnaryCallable + listManagedFoldersPagedCallable() { + return listManagedFoldersPagedCallable; + } + @Override public final void close() { try { diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java index 681466af98..46f3321d4a 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStub.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.BackgroundResource; import com.google.api.gax.rpc.OperationCallable; @@ -25,12 +26,18 @@ import com.google.longrunning.stub.OperationsStub; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -82,6 +89,28 @@ public UnaryCallable getStorageLayoutCal throw new UnsupportedOperationException("Not implemented: getStorageLayoutCallable()"); } + public UnaryCallable createManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: createManagedFolderCallable()"); + } + + public UnaryCallable deleteManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: deleteManagedFolderCallable()"); + } + + public UnaryCallable getManagedFolderCallable() { + throw new UnsupportedOperationException("Not implemented: getManagedFolderCallable()"); + } + + public UnaryCallable + listManagedFoldersPagedCallable() { + throw new UnsupportedOperationException("Not implemented: listManagedFoldersPagedCallable()"); + } + + public UnaryCallable + listManagedFoldersCallable() { + throw new UnsupportedOperationException("Not implemented: listManagedFoldersCallable()"); + } + @Override public abstract void close(); } diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java index c1bf741c15..5b34d70054 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/StorageControlStubSettings.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2.stub; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.core.ApiFunction; import com.google.api.core.ApiFuture; @@ -50,12 +51,18 @@ import com.google.longrunning.Operation; import com.google.protobuf.Empty; import com.google.storage.control.v2.CreateFolderRequest; +import com.google.storage.control.v2.CreateManagedFolderRequest; import com.google.storage.control.v2.DeleteFolderRequest; +import com.google.storage.control.v2.DeleteManagedFolderRequest; import com.google.storage.control.v2.Folder; import com.google.storage.control.v2.GetFolderRequest; +import com.google.storage.control.v2.GetManagedFolderRequest; import com.google.storage.control.v2.GetStorageLayoutRequest; import com.google.storage.control.v2.ListFoldersRequest; import com.google.storage.control.v2.ListFoldersResponse; +import com.google.storage.control.v2.ListManagedFoldersRequest; +import com.google.storage.control.v2.ListManagedFoldersResponse; +import com.google.storage.control.v2.ManagedFolder; import com.google.storage.control.v2.RenameFolderMetadata; import com.google.storage.control.v2.RenameFolderRequest; import com.google.storage.control.v2.StorageLayout; @@ -122,6 +129,13 @@ public class StorageControlStubSettings extends StubSettings renameFolderOperationSettings; private final UnaryCallSettings getStorageLayoutSettings; + private final UnaryCallSettings + createManagedFolderSettings; + private final UnaryCallSettings deleteManagedFolderSettings; + private final UnaryCallSettings getManagedFolderSettings; + private final PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings; private static final PagedListDescriptor LIST_FOLDERS_PAGE_STR_DESC = @@ -159,6 +173,46 @@ public Iterable extractResources(ListFoldersResponse payload) { } }; + private static final PagedListDescriptor< + ListManagedFoldersRequest, ListManagedFoldersResponse, ManagedFolder> + LIST_MANAGED_FOLDERS_PAGE_STR_DESC = + new PagedListDescriptor< + ListManagedFoldersRequest, ListManagedFoldersResponse, ManagedFolder>() { + @Override + public String emptyToken() { + return ""; + } + + @Override + public ListManagedFoldersRequest injectToken( + ListManagedFoldersRequest payload, String token) { + return ListManagedFoldersRequest.newBuilder(payload).setPageToken(token).build(); + } + + @Override + public ListManagedFoldersRequest injectPageSize( + ListManagedFoldersRequest payload, int pageSize) { + return ListManagedFoldersRequest.newBuilder(payload).setPageSize(pageSize).build(); + } + + @Override + public Integer extractPageSize(ListManagedFoldersRequest payload) { + return payload.getPageSize(); + } + + @Override + public String extractNextToken(ListManagedFoldersResponse payload) { + return payload.getNextPageToken(); + } + + @Override + public Iterable extractResources(ListManagedFoldersResponse payload) { + return payload.getManagedFoldersList() == null + ? ImmutableList.of() + : payload.getManagedFoldersList(); + } + }; + private static final PagedListResponseFactory< ListFoldersRequest, ListFoldersResponse, ListFoldersPagedResponse> LIST_FOLDERS_PAGE_STR_FACT = @@ -176,6 +230,27 @@ public ApiFuture getFuturePagedResponse( } }; + private static final PagedListResponseFactory< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + LIST_MANAGED_FOLDERS_PAGE_STR_FACT = + new PagedListResponseFactory< + ListManagedFoldersRequest, + ListManagedFoldersResponse, + ListManagedFoldersPagedResponse>() { + @Override + public ApiFuture getFuturePagedResponse( + UnaryCallable callable, + ListManagedFoldersRequest request, + ApiCallContext context, + ApiFuture futureResponse) { + PageContext + pageContext = + PageContext.create( + callable, LIST_MANAGED_FOLDERS_PAGE_STR_DESC, request, context); + return ListManagedFoldersPagedResponse.createAsync(pageContext, futureResponse); + } + }; + /** Returns the object with the settings used for calls to createFolder. */ public UnaryCallSettings createFolderSettings() { return createFolderSettings; @@ -213,6 +288,29 @@ public UnaryCallSettings getStorageLayou return getStorageLayoutSettings; } + /** Returns the object with the settings used for calls to createManagedFolder. */ + public UnaryCallSettings + createManagedFolderSettings() { + return createManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings deleteManagedFolderSettings() { + return deleteManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to getManagedFolder. */ + public UnaryCallSettings getManagedFolderSettings() { + return getManagedFolderSettings; + } + + /** Returns the object with the settings used for calls to listManagedFolders. */ + public PagedCallSettings< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return listManagedFoldersSettings; + } + public StorageControlStub createStub() throws IOException { if (getTransportChannelProvider() .getTransportName() @@ -309,6 +407,10 @@ protected StorageControlStubSettings(Builder settingsBuilder) throws IOException renameFolderSettings = settingsBuilder.renameFolderSettings().build(); renameFolderOperationSettings = settingsBuilder.renameFolderOperationSettings().build(); getStorageLayoutSettings = settingsBuilder.getStorageLayoutSettings().build(); + createManagedFolderSettings = settingsBuilder.createManagedFolderSettings().build(); + deleteManagedFolderSettings = settingsBuilder.deleteManagedFolderSettings().build(); + getManagedFolderSettings = settingsBuilder.getManagedFolderSettings().build(); + listManagedFoldersSettings = settingsBuilder.listManagedFoldersSettings().build(); } /** Builder for StorageControlStubSettings. */ @@ -325,6 +427,15 @@ public static class Builder extends StubSettings.Builder getStorageLayoutSettings; + private final UnaryCallSettings.Builder + createManagedFolderSettings; + private final UnaryCallSettings.Builder + deleteManagedFolderSettings; + private final UnaryCallSettings.Builder + getManagedFolderSettings; + private final PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings; private static final ImmutableMap> RETRYABLE_CODE_DEFINITIONS; @@ -386,6 +497,10 @@ protected Builder(ClientContext clientContext) { renameFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); renameFolderOperationSettings = OperationCallSettings.newBuilder(); getStorageLayoutSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + createManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + deleteManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + getManagedFolderSettings = UnaryCallSettings.newUnaryCallSettingsBuilder(); + listManagedFoldersSettings = PagedCallSettings.newBuilder(LIST_MANAGED_FOLDERS_PAGE_STR_FACT); unaryMethodSettingsBuilders = ImmutableList.>of( @@ -394,7 +509,11 @@ protected Builder(ClientContext clientContext) { getFolderSettings, listFoldersSettings, renameFolderSettings, - getStorageLayoutSettings); + getStorageLayoutSettings, + createManagedFolderSettings, + deleteManagedFolderSettings, + getManagedFolderSettings, + listManagedFoldersSettings); initDefaults(this); } @@ -408,6 +527,10 @@ protected Builder(StorageControlStubSettings settings) { renameFolderSettings = settings.renameFolderSettings.toBuilder(); renameFolderOperationSettings = settings.renameFolderOperationSettings.toBuilder(); getStorageLayoutSettings = settings.getStorageLayoutSettings.toBuilder(); + createManagedFolderSettings = settings.createManagedFolderSettings.toBuilder(); + deleteManagedFolderSettings = settings.deleteManagedFolderSettings.toBuilder(); + getManagedFolderSettings = settings.getManagedFolderSettings.toBuilder(); + listManagedFoldersSettings = settings.listManagedFoldersSettings.toBuilder(); unaryMethodSettingsBuilders = ImmutableList.>of( @@ -416,7 +539,11 @@ protected Builder(StorageControlStubSettings settings) { getFolderSettings, listFoldersSettings, renameFolderSettings, - getStorageLayoutSettings); + getStorageLayoutSettings, + createManagedFolderSettings, + deleteManagedFolderSettings, + getManagedFolderSettings, + listManagedFoldersSettings); } private static Builder createDefault() { @@ -462,6 +589,26 @@ private static Builder initDefaults(Builder builder) { .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + builder + .createManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params")); + + builder + .deleteManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("no_retry_1_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("no_retry_1_params")); + + builder + .getManagedFolderSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + + builder + .listManagedFoldersSettings() + .setRetryableCodes(RETRYABLE_CODE_DEFINITIONS.get("retry_policy_0_codes")) + .setRetrySettings(RETRY_PARAM_DEFINITIONS.get("retry_policy_0_params")); + builder .renameFolderOperationSettings() .setInitialCallSettings( @@ -543,6 +690,31 @@ public UnaryCallSettings.Builder renameFolderSet return getStorageLayoutSettings; } + /** Returns the builder for the settings used for calls to createManagedFolder. */ + public UnaryCallSettings.Builder + createManagedFolderSettings() { + return createManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to deleteManagedFolder. */ + public UnaryCallSettings.Builder + deleteManagedFolderSettings() { + return deleteManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to getManagedFolder. */ + public UnaryCallSettings.Builder + getManagedFolderSettings() { + return getManagedFolderSettings; + } + + /** Returns the builder for the settings used for calls to listManagedFolders. */ + public PagedCallSettings.Builder< + ListManagedFoldersRequest, ListManagedFoldersResponse, ListManagedFoldersPagedResponse> + listManagedFoldersSettings() { + return listManagedFoldersSettings; + } + /** Returns the endpoint set by the user or the the service's default endpoint. */ @Override public String getEndpoint() { diff --git a/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json b/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json index ed0d3222c3..36399f5086 100644 --- a/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json +++ b/google-cloud-storage-control/src/main/resources/META-INF/native-image/com.google.storage.control.v2/reflect-config.json @@ -1439,6 +1439,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.CreateManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.CreateManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.DeleteFolderRequest", "queryAllDeclaredConstructors": true, @@ -1457,6 +1475,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.DeleteManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.DeleteManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.Folder", "queryAllDeclaredConstructors": true, @@ -1493,6 +1529,24 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.GetManagedFolderRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.GetManagedFolderRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.GetStorageLayoutRequest", "queryAllDeclaredConstructors": true, @@ -1547,6 +1601,60 @@ "allDeclaredClasses": true, "allPublicClasses": true }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersRequest", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersRequest$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersResponse", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ListManagedFoldersResponse$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ManagedFolder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, + { + "name": "com.google.storage.control.v2.ManagedFolder$Builder", + "queryAllDeclaredConstructors": true, + "queryAllPublicConstructors": true, + "queryAllDeclaredMethods": true, + "allPublicMethods": true, + "allDeclaredClasses": true, + "allPublicClasses": true + }, { "name": "com.google.storage.control.v2.PendingRenameInfo", "queryAllDeclaredConstructors": true, diff --git a/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json b/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json index cafc1e3145..d2d8f4700a 100644 --- a/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json +++ b/google-cloud-storage-control/src/main/resources/com/google/storage/control/v2/gapic_metadata.json @@ -13,18 +13,30 @@ "CreateFolder": { "methods": ["createFolder", "createFolder", "createFolder", "createFolderCallable"] }, + "CreateManagedFolder": { + "methods": ["createManagedFolder", "createManagedFolder", "createManagedFolder", "createManagedFolderCallable"] + }, "DeleteFolder": { "methods": ["deleteFolder", "deleteFolder", "deleteFolder", "deleteFolderCallable"] }, + "DeleteManagedFolder": { + "methods": ["deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolder", "deleteManagedFolderCallable"] + }, "GetFolder": { "methods": ["getFolder", "getFolder", "getFolder", "getFolderCallable"] }, + "GetManagedFolder": { + "methods": ["getManagedFolder", "getManagedFolder", "getManagedFolder", "getManagedFolderCallable"] + }, "GetStorageLayout": { "methods": ["getStorageLayout", "getStorageLayout", "getStorageLayout", "getStorageLayoutCallable"] }, "ListFolders": { "methods": ["listFolders", "listFolders", "listFolders", "listFoldersPagedCallable", "listFoldersCallable"] }, + "ListManagedFolders": { + "methods": ["listManagedFolders", "listManagedFolders", "listManagedFolders", "listManagedFoldersPagedCallable", "listManagedFoldersCallable"] + }, "RenameFolder": { "methods": ["renameFolderAsync", "renameFolderAsync", "renameFolderAsync", "renameFolderOperationCallable", "renameFolderCallable"] } diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java index 0177422a92..e049667af3 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControlImpl.java @@ -182,4 +182,89 @@ public void getStorageLayout( Exception.class.getName()))); } } + + @Override + public void createManagedFolder( + CreateManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ManagedFolder) { + requests.add(request); + responseObserver.onNext(((ManagedFolder) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method CreateManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ManagedFolder.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void deleteManagedFolder( + DeleteManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof Empty) { + requests.add(request); + responseObserver.onNext(((Empty) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method DeleteManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + Empty.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void getManagedFolder( + GetManagedFolderRequest request, StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ManagedFolder) { + requests.add(request); + responseObserver.onNext(((ManagedFolder) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method GetManagedFolder, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ManagedFolder.class.getName(), + Exception.class.getName()))); + } + } + + @Override + public void listManagedFolders( + ListManagedFoldersRequest request, + StreamObserver responseObserver) { + Object response = responses.poll(); + if (response instanceof ListManagedFoldersResponse) { + requests.add(request); + responseObserver.onNext(((ListManagedFoldersResponse) response)); + responseObserver.onCompleted(); + } else if (response instanceof Exception) { + responseObserver.onError(((Exception) response)); + } else { + responseObserver.onError( + new IllegalArgumentException( + String.format( + "Unrecognized response type %s for method ListManagedFolders, expected %s or %s", + response == null ? "null" : response.getClass().getName(), + ListManagedFoldersResponse.class.getName(), + Exception.class.getName()))); + } + } } diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java index 8559283b16..5ac98ecfe2 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientTest.java @@ -17,6 +17,7 @@ package com.google.storage.control.v2; import static com.google.storage.control.v2.StorageControlClient.ListFoldersPagedResponse; +import static com.google.storage.control.v2.StorageControlClient.ListManagedFoldersPagedResponse; import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GaxGrpcProperties; @@ -609,4 +610,338 @@ public void getStorageLayoutExceptionTest2() throws Exception { // Expected exception. } } + + @Test + public void createManagedFolderTest() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + + ManagedFolder actualResponse = + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + CreateManagedFolderRequest actualRequest = ((CreateManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(parent.toString(), actualRequest.getParent()); + Assert.assertEquals(managedFolder, actualRequest.getManagedFolder()); + Assert.assertEquals(managedFolderId, actualRequest.getManagedFolderId()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void createManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void createManagedFolderTest2() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String parent = "parent-995424086"; + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + + ManagedFolder actualResponse = + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + CreateManagedFolderRequest actualRequest = ((CreateManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(parent, actualRequest.getParent()); + Assert.assertEquals(managedFolder, actualRequest.getManagedFolder()); + Assert.assertEquals(managedFolderId, actualRequest.getManagedFolderId()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void createManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String parent = "parent-995424086"; + ManagedFolder managedFolder = ManagedFolder.newBuilder().build(); + String managedFolderId = "managedFolderId-2027084056"; + client.createManagedFolder(parent, managedFolder, managedFolderId); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void deleteManagedFolderTest() throws Exception { + Empty expectedResponse = Empty.newBuilder().build(); + mockStorageControl.addResponse(expectedResponse); + + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + + client.deleteManagedFolder(name); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + DeleteManagedFolderRequest actualRequest = ((DeleteManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name.toString(), actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void deleteManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + client.deleteManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void deleteManagedFolderTest2() throws Exception { + Empty expectedResponse = Empty.newBuilder().build(); + mockStorageControl.addResponse(expectedResponse); + + String name = "name3373707"; + + client.deleteManagedFolder(name); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + DeleteManagedFolderRequest actualRequest = ((DeleteManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name, actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void deleteManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String name = "name3373707"; + client.deleteManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getManagedFolderTest() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + + ManagedFolder actualResponse = client.getManagedFolder(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + GetManagedFolderRequest actualRequest = ((GetManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name.toString(), actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void getManagedFolderExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + ManagedFolderName name = ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]"); + client.getManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void getManagedFolderTest2() throws Exception { + ManagedFolder expectedResponse = + ManagedFolder.newBuilder() + .setName(ManagedFolderName.of("[PROJECT]", "[BUCKET]", "[MANAGEDFOLDER]").toString()) + .setMetageneration(1048558813) + .setCreateTime(Timestamp.newBuilder().build()) + .setUpdateTime(Timestamp.newBuilder().build()) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String name = "name3373707"; + + ManagedFolder actualResponse = client.getManagedFolder(name); + Assert.assertEquals(expectedResponse, actualResponse); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + GetManagedFolderRequest actualRequest = ((GetManagedFolderRequest) actualRequests.get(0)); + + Assert.assertEquals(name, actualRequest.getName()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void getManagedFolderExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String name = "name3373707"; + client.getManagedFolder(name); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listManagedFoldersTest() throws Exception { + ManagedFolder responsesElement = ManagedFolder.newBuilder().build(); + ListManagedFoldersResponse expectedResponse = + ListManagedFoldersResponse.newBuilder() + .setNextPageToken("") + .addAllManagedFolders(Arrays.asList(responsesElement)) + .build(); + mockStorageControl.addResponse(expectedResponse); + + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + + ListManagedFoldersPagedResponse pagedListResponse = client.listManagedFolders(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getManagedFoldersList().get(0), resources.get(0)); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListManagedFoldersRequest actualRequest = ((ListManagedFoldersRequest) actualRequests.get(0)); + + Assert.assertEquals(parent.toString(), actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listManagedFoldersExceptionTest() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + BucketName parent = BucketName.of("[PROJECT]", "[BUCKET]"); + client.listManagedFolders(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } + + @Test + public void listManagedFoldersTest2() throws Exception { + ManagedFolder responsesElement = ManagedFolder.newBuilder().build(); + ListManagedFoldersResponse expectedResponse = + ListManagedFoldersResponse.newBuilder() + .setNextPageToken("") + .addAllManagedFolders(Arrays.asList(responsesElement)) + .build(); + mockStorageControl.addResponse(expectedResponse); + + String parent = "parent-995424086"; + + ListManagedFoldersPagedResponse pagedListResponse = client.listManagedFolders(parent); + + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); + + Assert.assertEquals(1, resources.size()); + Assert.assertEquals(expectedResponse.getManagedFoldersList().get(0), resources.get(0)); + + List actualRequests = mockStorageControl.getRequests(); + Assert.assertEquals(1, actualRequests.size()); + ListManagedFoldersRequest actualRequest = ((ListManagedFoldersRequest) actualRequests.get(0)); + + Assert.assertEquals(parent, actualRequest.getParent()); + Assert.assertTrue( + channelProvider.isHeaderSent( + ApiClientHeaderProvider.getDefaultApiClientHeaderKey(), + GaxGrpcProperties.getDefaultApiClientHeaderPattern())); + } + + @Test + public void listManagedFoldersExceptionTest2() throws Exception { + StatusRuntimeException exception = new StatusRuntimeException(io.grpc.Status.INVALID_ARGUMENT); + mockStorageControl.addException(exception); + + try { + String parent = "parent-995424086"; + client.listManagedFolders(parent); + Assert.fail("No exception raised"); + } catch (InvalidArgumentException e) { + // Expected exception. + } + } } diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml index 7fffdb6bdf..cc9d69330f 100644 --- a/google-cloud-storage/clirr-ignored-differences.xml +++ b/google-cloud-storage/clirr-ignored-differences.xml @@ -61,4 +61,21 @@ com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig$PartNamingStrategy java.lang.String fmtFields(*) + + 7002 + com/google/cloud/storage/transfermanager/TransferManagerConfig + boolean isAllowDivideAndConquer() + + + 7002 + com/google/cloud/storage/transfermanager/TransferManagerConfig$Builder + * setAllowDivideAndConquer(boolean) + + + + 7013 + com/google/cloud/storage/StorageOptions$Builder + com.google.cloud.storage.StorageOptions$Builder setBlobWriteSessionConfig(com.google.cloud.storage.BlobWriteSessionConfig) + + diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 22d2877a02..e9f67c2bb8 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.36.1 + 2.37.0 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,11 +12,11 @@ com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 google-cloud-storage - 1.109.3 + 1.111.0 5.10.2 @@ -96,6 +96,14 @@ com.google.protobuf protobuf-java-util + + io.grpc + grpc-core + + + io.grpc + grpc-protobuf + com.google.api.grpc proto-google-common-protos @@ -173,13 +181,13 @@ com.google.api.grpc proto-google-cloud-kms-v1 - 0.131.0 + 0.135.0 test com.google.cloud google-cloud-kms - 2.40.0 + 2.44.0 test @@ -210,11 +218,6 @@ - - org.easymock - easymock - test - org.mockito mockito-core @@ -251,6 +254,12 @@ 1.8.4 test + + org.junit.vintage + junit-vintage-engine + ${junit-platform.version} + test + @@ -293,6 +302,11 @@ google-api-client to be able to bootstrap. --> com.google.http-client:google-http-client-gson + + org.junit.vintage:junit-vintage-engine @@ -316,7 +330,6 @@ sponge_log - org.apache.maven.surefire diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java index da13857291..27800e4bbc 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryUnbufferedWritableByteChannel.java @@ -96,30 +96,32 @@ private long internalWrite(ByteBuffer[] srcs, int offset, int length, boolean fi } RewindableContent content = RewindableContent.of(Utils.subArray(srcs, offset, length)); long available = content.getLength(); + // as long as request has at least 256KiB GCS will accept bytes in 256KiB increments, + // however if a request is smaller than 256KiB it MUST be the finalization request. + if (!finalize && available < ByteSizeConstants._256KiB) { + return 0; + } long newFinalByteOffset = cumulativeByteCount + available; final HttpContentRange header; ByteRangeSpec rangeSpec = ByteRangeSpec.explicit(cumulativeByteCount, newFinalByteOffset); - boolean quantumAligned = available % ByteSizeConstants._256KiB == 0; - if (quantumAligned && finalize) { + if (finalize) { header = HttpContentRange.of(rangeSpec, newFinalByteOffset); finished = true; - } else if (quantumAligned) { + } else { header = HttpContentRange.of(rangeSpec); - } else { // not quantum aligned, have to finalize - header = HttpContentRange.of(rangeSpec, newFinalByteOffset); - finished = true; } try { ResumableOperationResult<@Nullable StorageObject> operationResult = session.put(content, header); long persistedSize = operationResult.getPersistedSize(); committedBytesCallback.accept(persistedSize); + long written = persistedSize - cumulativeByteCount; this.cumulativeByteCount = persistedSize; if (finished) { StorageObject storageObject = operationResult.getObject(); result.set(storageObject); } - return available; + return written; } catch (Exception e) { result.setException(e); throw StorageException.coalesce(e); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java index 06dd7e7a02..390c5abbc0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiBlobWriteSessionConfig.java @@ -17,19 +17,31 @@ package com.google.cloud.storage; import com.google.api.core.ApiFuture; -import com.google.api.core.ApiFutures; import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.api.gax.grpc.GrpcCallContext; +import com.google.cloud.storage.DefaultBlobWriteSessionConfig.DecoratedWritableByteChannelSession; +import com.google.cloud.storage.DefaultBlobWriteSessionConfig.LazySession; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.MoreExecutors; import com.google.storage.v2.BidiWriteObjectRequest; import com.google.storage.v2.BidiWriteObjectResponse; import java.io.IOException; -import java.nio.channels.WritableByteChannel; import java.time.Clock; +import javax.annotation.concurrent.Immutable; -public class BidiBlobWriteSessionConfig extends BlobWriteSessionConfig +/** + * Perform a resumable upload, uploading at most {@code bufferSize} bytes each flush. + * + *

Configuration of buffer size can be performed via {@link + * BidiBlobWriteSessionConfig#withBufferSize(int)}. + * + * @since 2.34.0 This new api is in preview and is subject to breaking changes. + */ +@Immutable +@BetaApi +@TransportCompatibility({Transport.GRPC}) +public final class BidiBlobWriteSessionConfig extends BlobWriteSessionConfig implements BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = -903533790705476197L; @@ -54,7 +66,7 @@ public int getBufferSize() { @Override WriterFactory createFactory(Clock clock) throws IOException { - return new Factory(ByteSizeConstants._16MiB); + return new Factory(bufferSize); } @InternalApi @@ -124,57 +136,4 @@ public BidiBlobWriteSessionConfig withBufferSize(int bufferSize) { ByteSizeConstants._256KiB); return new BidiBlobWriteSessionConfig(bufferSize); } - - private static final class DecoratedWritableByteChannelSession - implements WritableByteChannelSession { - - private final WritableByteChannelSession delegate; - private final Conversions.Decoder decoder; - - private DecoratedWritableByteChannelSession( - WritableByteChannelSession delegate, Conversions.Decoder decoder) { - this.delegate = delegate; - this.decoder = decoder; - } - - @Override - public WBC open() { - try { - return WritableByteChannelSession.super.open(); - } catch (Exception e) { - throw StorageException.coalesce(e); - } - } - - @Override - public ApiFuture openAsync() { - return delegate.openAsync(); - } - - @Override - public ApiFuture getResult() { - return ApiFutures.transform( - delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); - } - } - - private static final class LazySession - implements WritableByteChannelSession< - BufferedWritableByteChannelSession.BufferedWritableByteChannel, R> { - private final LazyWriteChannel lazy; - - private LazySession(LazyWriteChannel lazy) { - this.lazy = lazy; - } - - @Override - public ApiFuture openAsync() { - return lazy.getSession().openAsync(); - } - - @Override - public ApiFuture getResult() { - return lazy.getSession().getResult(); - } - } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java index 02ea23a6a7..81cecdc892 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSession.java @@ -20,6 +20,7 @@ import com.google.api.core.BetaApi; import java.io.IOException; import java.nio.channels.WritableByteChannel; +import java.util.concurrent.TimeUnit; /** * A session to write an object to Google Cloud Storage. @@ -50,6 +51,10 @@ public interface BlobWriteSession { *

Upon calling {@link WritableByteChannel#close()} the object creation will be finalized, and * {@link #getResult()}s future should resolve. * + *

The returned {@code WritableByteChannel} can throw IOExceptions from any of its usual + * methods. Any {@link IOException} thrown can have a cause of a {@link StorageException}. + * However, not all {@code IOExceptions} will have {@code StorageException}s. + * * @throws IOException When creating the {@link WritableByteChannel} if an unrecoverable * underlying IOException occurs it can be rethrown * @throws IllegalStateException if open is called more than once @@ -66,6 +71,10 @@ public interface BlobWriteSession { * Google Cloud Storage 2. A terminal failure occurs, the terminal failure will become the * exception result * + *

If a terminal failure is encountered, calling either {@link ApiFuture#get()} or {@link + * ApiFuture#get(long, TimeUnit)} will result in an {@link + * java.util.concurrent.ExecutionException} with a cause that is the {@link StorageException}. + * * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java index b52e9bd4f7..441f78ac77 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfig.java @@ -53,6 +53,15 @@ WritableByteChannelSession writeSession( StorageInternal s, BlobInfo info, Opts opts); } + /** + * Internal marker interface to signify an implementation of {@link BlobWriteSessionConfig} is + * compatible with {@link com.google.cloud.storage.TransportCompatibility.Transport#HTTP} + * + *

We could evaluate the annotations, but the code for that is more complicated and probably + * not worth the effort. + */ + interface HttpCompatible {} + /** * Internal marker interface to signify an implementation of {@link BlobWriteSessionConfig} is * compatible with {@link com.google.cloud.storage.TransportCompatibility.Transport#GRPC} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java index 43b68d8a0e..9e9479e144 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessionConfigs.java @@ -55,7 +55,7 @@ * full or close. Buffer size is configurable via * {@link DefaultBlobWriteSessionConfig#withChunkSize(int)} * - * gRPC + * gRPC, HTTP * The network will only be used for the following operations: *

    *
  1. Creating the Resumable Upload Session
  2. @@ -86,7 +86,7 @@ * Buffer bytes to a temporary file on disk. On {@link WritableByteChannel#close() close()} * upload the entire files contents to Cloud Storage. Delete the temporary file. * - * gRPC + * gRPC, HTTP * *
      *
    1. A Resumable Upload Session will be used to upload the file on disk.
    2. @@ -142,7 +142,7 @@ * Break the stream of bytes into smaller part objects uploading each part in parallel. Then * composing the parts together to make the ultimate object. * - * gRPC + * gRPC, HTTP * *
        *
      1. @@ -241,7 +241,7 @@ private BlobWriteSessionConfigs() {} * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static DefaultBlobWriteSessionConfig getDefault() { return new DefaultBlobWriteSessionConfig(ByteSizeConstants._16MiB); } @@ -272,7 +272,7 @@ public static BidiBlobWriteSessionConfig bidiWrite() { * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BlobWriteSessionConfig bufferToTempDirThenUpload() throws IOException { return bufferToDiskThenUpload( Paths.get(System.getProperty("java.io.tmpdir"), "google-cloud-storage")); @@ -289,7 +289,7 @@ public static BlobWriteSessionConfig bufferToTempDirThenUpload() throws IOExcept * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BufferToDiskThenUpload bufferToDiskThenUpload(Path path) throws IOException { return bufferToDiskThenUpload(ImmutableList.of(path)); } @@ -308,7 +308,7 @@ public static BufferToDiskThenUpload bufferToDiskThenUpload(Path path) throws IO * @since 2.26.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static BufferToDiskThenUpload bufferToDiskThenUpload(Collection paths) throws IOException { return new BufferToDiskThenUpload(ImmutableList.copyOf(paths), false); @@ -342,7 +342,7 @@ public static JournalingBlobWriteSessionConfig journaling(Collection paths * @since 2.28.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - @TransportCompatibility({Transport.GRPC}) + @TransportCompatibility({Transport.GRPC, Transport.HTTP}) public static ParallelCompositeUploadBlobWriteSessionConfig parallelCompositeUpload() { return ParallelCompositeUploadBlobWriteSessionConfig.withDefaults(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java index 878552a125..c9da9ee05c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteSessions.java @@ -17,6 +17,7 @@ package com.google.cloud.storage; import com.google.api.core.ApiFuture; +import com.google.common.base.Preconditions; import java.io.IOException; import java.nio.channels.WritableByteChannel; @@ -30,14 +31,20 @@ static BlobWriteSession of(WritableByteChannelSession s) { static final class WritableByteChannelSessionAdapter implements BlobWriteSession { private final WritableByteChannelSession delegate; + private boolean open; private WritableByteChannelSessionAdapter(WritableByteChannelSession delegate) { this.delegate = delegate; + open = false; } @Override public WritableByteChannel open() throws IOException { - return delegate.open(); + synchronized (this) { + Preconditions.checkState(!open, "already open"); + open = true; + return delegate.open(); + } } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java index 8c9cb7c107..58ce102932 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BufferToDiskThenUpload.java @@ -59,9 +59,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class BufferToDiskThenUpload extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = 9059242302276891867L; /** diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java index 090f929e7e..ffcbcfa8ee 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/DefaultBlobWriteSessionConfig.java @@ -21,17 +21,23 @@ import com.google.api.core.BetaApi; import com.google.api.core.InternalApi; import com.google.api.gax.grpc.GrpcCallContext; +import com.google.api.services.storage.model.StorageObject; import com.google.cloud.storage.BufferedWritableByteChannelSession.BufferedWritableByteChannel; import com.google.cloud.storage.Conversions.Decoder; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.UnifiedOpts.ObjectTargetOpt; import com.google.cloud.storage.UnifiedOpts.Opts; +import com.google.cloud.storage.spi.v1.StorageRpc; import com.google.common.base.Preconditions; import com.google.common.util.concurrent.MoreExecutors; import com.google.storage.v2.WriteObjectRequest; import com.google.storage.v2.WriteObjectResponse; +import java.io.IOException; +import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; import java.time.Clock; +import java.util.Map; +import java.util.function.Supplier; import javax.annotation.concurrent.Immutable; /** @@ -55,9 +61,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class DefaultBlobWriteSessionConfig extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final long serialVersionUID = -6873740918589930633L; private final int chunkSize; @@ -146,6 +152,39 @@ public WritableByteChannelSession writeSession( .build(); })), WRITE_OBJECT_RESPONSE_BLOB_INFO_DECODER); + } else if (s instanceof StorageImpl) { + StorageImpl json = (StorageImpl) s; + + return new DecoratedWritableByteChannelSession<>( + new LazySession<>( + new LazyWriteChannel<>( + () -> { + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = info.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + + StorageObject encode = Conversions.json().blobInfo().encode(updated); + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + json.getOptions(), + updated, + optionsMap, + json.retryAlgorithmManager.getForResumableUploadSessionCreate( + optionsMap)); + ApiFuture startAsync = + ApiFutures.immediateFuture( + JsonResumableWrite.of( + encode, optionsMap, uploadIdSupplier.get(), 0L)); + + return ResumableMedia.http() + .write() + .byteChannel(HttpClientContext.from(json.storageRpc)) + .resumable() + .buffered(BufferHandle.allocate(chunkSize)) + .setStartAsync(startAsync) + .build(); + })), + Conversions.json().blobInfo()); } else { throw new IllegalStateException( "Unknown Storage implementation: " + s.getClass().getName()); @@ -153,50 +192,99 @@ public WritableByteChannelSession writeSession( } } - private static final class DecoratedWritableByteChannelSession + static final class DecoratedWritableByteChannelSession implements WritableByteChannelSession { private final WritableByteChannelSession delegate; private final Decoder decoder; - private DecoratedWritableByteChannelSession( + DecoratedWritableByteChannelSession( WritableByteChannelSession delegate, Decoder decoder) { this.delegate = delegate; this.decoder = decoder; } - @Override - public WBC open() { - try { - return WritableByteChannelSession.super.open(); - } catch (Exception e) { - throw StorageException.coalesce(e); - } - } - @Override public ApiFuture openAsync() { - return delegate.openAsync(); + return ApiFutures.catchingAsync( + delegate.openAsync(), + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), + MoreExecutors.directExecutor()); } @Override public ApiFuture getResult() { - return ApiFutures.transform( - delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); + ApiFuture decodeResult = + ApiFutures.transform( + delegate.getResult(), decoder::decode, MoreExecutors.directExecutor()); + return ApiFutures.catchingAsync( + decodeResult, + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), + MoreExecutors.directExecutor()); } } - private static final class LazySession + static final class LazySession implements WritableByteChannelSession { private final LazyWriteChannel lazy; - private LazySession(LazyWriteChannel lazy) { + LazySession(LazyWriteChannel lazy) { this.lazy = lazy; } @Override public ApiFuture openAsync() { - return lazy.getSession().openAsync(); + // make sure the errors coming out of the BufferedWritableByteChannel are either IOException + // or StorageException + return ApiFutures.transform( + lazy.getSession().openAsync(), + delegate -> + new BufferedWritableByteChannel() { + @Override + public int write(ByteBuffer src) throws IOException { + try { + return delegate.write(src); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public void flush() throws IOException { + try { + delegate.flush(); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public boolean isOpen() { + try { + return delegate.isOpen(); + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public void close() throws IOException { + try { + delegate.close(); + } catch (IOException e) { + throw e; + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + }, + MoreExecutors.directExecutor()); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java index 704794a389..82789bcd2f 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicDownloadSessionBuilder.java @@ -48,19 +48,23 @@ public static GapicDownloadSessionBuilder create() { * ultimately produced channel will not do any retries of its own. */ public ReadableByteChannelSessionBuilder byteChannel( - ServerStreamingCallable read) { - return new ReadableByteChannelSessionBuilder(read); + ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager) { + return new ReadableByteChannelSessionBuilder(read, responseContentLifecycleManager); } public static final class ReadableByteChannelSessionBuilder { private final ServerStreamingCallable read; + private final ResponseContentLifecycleManager responseContentLifecycleManager; private boolean autoGzipDecompression; private Hasher hasher; private ReadableByteChannelSessionBuilder( - ServerStreamingCallable read) { + ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager) { this.read = read; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.hasher = Hasher.noop(); this.autoGzipDecompression = false; } @@ -100,11 +104,13 @@ public UnbufferedReadableByteChannelSessionBuilder unbuffered() { return (object, resultFuture) -> { if (autoGzipDecompression) { return new GzipReadableByteChannel( - new GapicUnbufferedReadableByteChannel(resultFuture, read, object, hasher), + new GapicUnbufferedReadableByteChannel( + resultFuture, read, object, hasher, responseContentLifecycleManager), ApiFutures.transform( resultFuture, Object::getContentEncoding, MoreExecutors.directExecutor())); } else { - return new GapicUnbufferedReadableByteChannel(resultFuture, read, object, hasher); + return new GapicUnbufferedReadableByteChannel( + resultFuture, read, object, hasher, responseContentLifecycleManager); } }; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java index 4b19c3f998..6cecc8dded 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedReadableByteChannel.java @@ -16,8 +16,6 @@ package com.google.cloud.storage; -import static com.google.common.base.Preconditions.checkArgument; - import com.google.api.client.http.HttpStatusCodes; import com.google.api.core.ApiFuture; import com.google.api.core.SettableApiFuture; @@ -25,6 +23,7 @@ import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.cloud.storage.Crc32cValue.Crc32cLengthKnown; import com.google.cloud.storage.UnbufferedReadableByteChannelSession.UnbufferedReadableByteChannel; +import com.google.protobuf.ByteString; import com.google.storage.v2.ChecksummedData; import com.google.storage.v2.Object; import com.google.storage.v2.ReadObjectRequest; @@ -46,6 +45,7 @@ final class GapicUnbufferedReadableByteChannel private final ReadObjectRequest req; private final Hasher hasher; private final LazyServerStreamIterator iter; + private final ResponseContentLifecycleManager rclm; private boolean open = true; private boolean complete = false; @@ -53,18 +53,20 @@ final class GapicUnbufferedReadableByteChannel private Object metadata; - private ByteBuffer leftovers; + private ResponseContentLifecycleHandle leftovers; GapicUnbufferedReadableByteChannel( SettableApiFuture result, ServerStreamingCallable read, ReadObjectRequest req, - Hasher hasher) { + Hasher hasher, + ResponseContentLifecycleManager rclm) { this.result = result; this.read = read; this.req = req; this.hasher = hasher; this.blobOffset = req.getReadOffset(); + this.rclm = rclm; this.iter = new LazyServerStreamIterator(); } @@ -82,8 +84,9 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { ReadCursor c = new ReadCursor(blobOffset, blobOffset + totalBufferCapacity); while (c.hasRemaining()) { if (leftovers != null) { - copy(c, leftovers, dsts, offset, length); + leftovers.copy(c, dsts, offset, length); if (!leftovers.hasRemaining()) { + leftovers.close(); leftovers = null; } continue; @@ -91,6 +94,7 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { if (iter.hasNext()) { ReadObjectResponse resp = iter.next(); + ResponseContentLifecycleHandle handle = rclm.get(resp); if (resp.hasMetadata()) { Object respMetadata = resp.getMetadata(); if (metadata == null) { @@ -107,22 +111,24 @@ public long read(ByteBuffer[] dsts, int offset, int length) throws IOException { } } ChecksummedData checksummedData = resp.getChecksummedData(); - ByteBuffer content = checksummedData.getContent().asReadOnlyByteBuffer(); - // very important to know whether a crc32c value is set. Without checking, protobuf will + ByteString content = checksummedData.getContent(); + int contentSize = content.size(); + // Very important to know whether a crc32c value is set. Without checking, protobuf will // happily return 0, which is a valid crc32c value. if (checksummedData.hasCrc32C()) { - Crc32cLengthKnown expected = - Crc32cValue.of(checksummedData.getCrc32C(), checksummedData.getContent().size()); + Crc32cLengthKnown expected = Crc32cValue.of(checksummedData.getCrc32C(), contentSize); try { - hasher.validate(expected, content::duplicate); + hasher.validate(expected, content.asReadOnlyByteBufferList()); } catch (IOException e) { close(); throw e; } } - copy(c, content, dsts, offset, length); - if (content.hasRemaining()) { - leftovers = content; + handle.copy(c, dsts, offset, length); + if (handle.hasRemaining()) { + leftovers = handle; + } else { + handle.close(); } } else { complete = true; @@ -144,18 +150,19 @@ public boolean isOpen() { @Override public void close() throws IOException { open = false; - iter.close(); + try { + if (leftovers != null) { + leftovers.close(); + } + } finally { + iter.close(); + } } ApiFuture getResult() { return result; } - private void copy(ReadCursor c, ByteBuffer content, ByteBuffer[] dsts, int offset, int length) { - long copiedBytes = Buffers.copy(content, dsts, offset, length); - c.advance(copiedBytes); - } - private IOException closeWithError(String message) throws IOException { close(); StorageException cause = @@ -163,40 +170,6 @@ private IOException closeWithError(String message) throws IOException { throw new IOException(message, cause); } - /** - * Shrink wraps a beginning, offset and limit for tracking state of an individual invocation of - * {@link #read} - */ - private static final class ReadCursor { - private final long beginning; - private long offset; - private final long limit; - - private ReadCursor(long beginning, long limit) { - this.limit = limit; - this.beginning = beginning; - this.offset = beginning; - } - - public boolean hasRemaining() { - return limit - offset > 0; - } - - public void advance(long incr) { - checkArgument(incr >= 0); - offset += incr; - } - - public long read() { - return offset - beginning; - } - - @Override - public String toString() { - return String.format("ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); - } - } - private final class LazyServerStreamIterator implements Iterator, Closeable { private ServerStream serverStream; private Iterator responseIterator; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java index b4a26ed4d3..32d5eb9dc8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUnbufferedWritableByteChannel.java @@ -92,7 +92,12 @@ public void close() throws IOException { throw e; } } else { - flusher.close(null); + try { + flusher.close(null); + } catch (RuntimeException e) { + resultFuture.setException(e); + throw e; + } } open = false; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java index ac52021308..2d1daa5444 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GapicUploadSessionBuilder.java @@ -49,7 +49,7 @@ GapicBidiWritableByteChannelSessionBuilder bidiByteChannel( } ApiFuture resumableWrite( - UnaryCallable x, + UnaryCallable callable, WriteObjectRequest writeObjectRequest) { StartResumableWriteRequest.Builder b = StartResumableWriteRequest.newBuilder(); if (writeObjectRequest.hasWriteObjectSpec()) { @@ -65,9 +65,16 @@ ApiFuture resumableWrite( Function f = uploadId -> writeObjectRequest.toBuilder().clearWriteObjectSpec().setUploadId(uploadId).build(); - return ApiFutures.transform( - x.futureCall(req), - (resp) -> new ResumableWrite(req, resp, f), + ApiFuture futureResumableWrite = + ApiFutures.transform( + callable.futureCall(req), + (resp) -> new ResumableWrite(req, resp, f), + MoreExecutors.directExecutor()); + // make sure we wrap any failure as a storage exception + return ApiFutures.catchingAsync( + futureResumableWrite, + Throwable.class, + throwable -> ApiFutures.immediateFailedFuture(StorageException.coalesce(throwable)), MoreExecutors.directExecutor()); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java index 4ae3f24466..03e3cb517a 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcBlobReadChannel.java @@ -28,15 +28,18 @@ final class GrpcBlobReadChannel extends BaseStorageReadChannel { private final ServerStreamingCallable read; + private final ResponseContentLifecycleManager responseContentLifecycleManager; private final ReadObjectRequest request; private final boolean autoGzipDecompression; GrpcBlobReadChannel( ServerStreamingCallable read, + ResponseContentLifecycleManager responseContentLifecycleManager, ReadObjectRequest request, boolean autoGzipDecompression) { super(Conversions.grpc().blobInfo()); this.read = read; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.request = request; this.autoGzipDecompression = autoGzipDecompression; } @@ -53,7 +56,7 @@ protected LazyReadChannel newLazyReadChannel() { ReadableByteChannelSessionBuilder b = ResumableMedia.gapic() .read() - .byteChannel(read) + .byteChannel(read, responseContentLifecycleManager) .setHasher(Hasher.noop()) .setAutoGzipDecompression(autoGzipDecompression); BufferHandle bufferHandle = getBufferHandle(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java index 28c51873b0..63a33b80a1 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java @@ -60,11 +60,13 @@ import com.google.storage.v2.Owner; import com.google.type.Date; import com.google.type.Expr; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.Instant; import java.time.LocalDate; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.Base64; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -118,6 +120,11 @@ final class GrpcConversions { hierarchicalNamespaceCodec = Codec.of(this::hierarchicalNamespaceEncode, this::hierarchicalNamespaceDecode); + private final Codec byteStringB64StringCodec = + Codec.of( + bs -> Base64.getEncoder().encodeToString(bs.toByteArray()), + s -> ByteString.copyFrom(Base64.getDecoder().decode(s.getBytes(StandardCharsets.UTF_8)))); + @VisibleForTesting final Codec timestampCodec = Codec.of( @@ -1048,7 +1055,7 @@ private NotificationInfo notificationDecode(NotificationConfig from) { private com.google.iam.v1.Policy policyEncode(Policy from) { com.google.iam.v1.Policy.Builder to = com.google.iam.v1.Policy.newBuilder(); - ifNonNull(from.getEtag(), ByteString::copyFromUtf8, to::setEtag); + ifNonNull(from.getEtag(), byteStringB64StringCodec::decode, to::setEtag); ifNonNull(from.getVersion(), to::setVersion); from.getBindingsList().stream().map(bindingCodec::encode).forEach(to::addBindings); return to.build(); @@ -1058,7 +1065,7 @@ private Policy policyDecode(com.google.iam.v1.Policy from) { Policy.Builder to = Policy.newBuilder(); ByteString etag = from.getEtag(); if (!etag.isEmpty()) { - to.setEtag(etag.toStringUtf8()); + to.setEtag(byteStringB64StringCodec.encode(etag)); } to.setVersion(from.getVersion()); List bindingsList = from.getBindingsList(); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java index de7af195b9..1178c7c942 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcRetryAlgorithmManager.java @@ -20,6 +20,7 @@ import com.google.iam.v1.GetIamPolicyRequest; import com.google.iam.v1.SetIamPolicyRequest; import com.google.iam.v1.TestIamPermissionsRequest; +import com.google.protobuf.ByteString; import com.google.storage.v2.BidiWriteObjectRequest; import com.google.storage.v2.ComposeObjectRequest; import com.google.storage.v2.CreateBucketRequest; @@ -86,11 +87,11 @@ public ResultRetryAlgorithm getFor(CreateNotificationConfigRequest req) { } public ResultRetryAlgorithm getFor(DeleteBucketRequest req) { - return retryStrategy.getNonidempotentHandler(); + return retryStrategy.getIdempotentHandler(); } public ResultRetryAlgorithm getFor(DeleteHmacKeyRequest req) { - return retryStrategy.getNonidempotentHandler(); + return retryStrategy.getIdempotentHandler(); } public ResultRetryAlgorithm getFor(DeleteNotificationConfigRequest req) { @@ -168,8 +169,11 @@ public ResultRetryAlgorithm getFor(RewriteObjectRequest req) { } public ResultRetryAlgorithm getFor(SetIamPolicyRequest req) { - // TODO: etag - return retryStrategy.getNonidempotentHandler(); + if (req.getPolicy().getEtag().equals(ByteString.empty())) { + return retryStrategy.getNonidempotentHandler(); + } else { + return retryStrategy.getIdempotentHandler(); + } } public ResultRetryAlgorithm getFor(StartResumableWriteRequest req) { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java index e9857e93d5..c195ce78f3 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java @@ -180,6 +180,7 @@ final class GrpcStorageImpl extends BaseService .collect(ImmutableSet.toImmutableSet()))); final StorageClient storageClient; + final ResponseContentLifecycleManager responseContentLifecycleManager; final WriterFactory writerFactory; final GrpcConversions codecs; final GrpcRetryAlgorithmManager retryAlgorithmManager; @@ -192,10 +193,12 @@ final class GrpcStorageImpl extends BaseService GrpcStorageImpl( GrpcStorageOptions options, StorageClient storageClient, + ResponseContentLifecycleManager responseContentLifecycleManager, WriterFactory writerFactory, Opts defaultOpts) { super(options); this.storageClient = storageClient; + this.responseContentLifecycleManager = responseContentLifecycleManager; this.writerFactory = writerFactory; this.defaultOpts = defaultOpts; this.codecs = Conversions.grpc(); @@ -259,8 +262,32 @@ public Blob create( @Override public Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... options) { try { - return createFrom(blobInfo, content, options); - } catch (IOException e) { + requireNonNull(blobInfo, "blobInfo must be non null"); + InputStream inputStreamParam = firstNonNull(content, new ByteArrayInputStream(ZERO_BYTES)); + + Opts optsWithDefaults = Opts.unwrap(options).prepend(defaultOpts); + GrpcCallContext grpcCallContext = + optsWithDefaults.grpcMetadataMapper().apply(GrpcCallContext.createDefault()); + WriteObjectRequest req = getWriteObjectRequest(blobInfo, optsWithDefaults); + Hasher hasher = Hasher.enabled(); + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + UnbufferedWritableByteChannelSession session = + ResumableMedia.gapic() + .write() + .byteChannel(storageClient.writeObjectCallable().withDefaultCallContext(merge)) + .setByteStringStrategy(ByteStringStrategy.noCopy()) + .setHasher(hasher) + .direct() + .unbuffered() + .setRequest(req) + .build(); + + try (UnbufferedWritableByteChannel c = session.open()) { + ByteStreams.copy(Channels.newChannel(inputStreamParam), c); + } + ApiFuture responseApiFuture = session.getResult(); + return this.getBlob(responseApiFuture); + } catch (IOException | ApiException e) { throw StorageException.coalesce(e); } } @@ -546,17 +573,20 @@ public boolean delete(String bucket, BucketSourceOption... options) { DeleteBucketRequest.Builder builder = DeleteBucketRequest.newBuilder().setName(bucketNameCodec.encode(bucket)); DeleteBucketRequest req = opts.deleteBucketsRequest().apply(builder).build(); - try { - GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); - Retrying.run( - getOptions(), - retryAlgorithmManager.getFor(req), - () -> storageClient.deleteBucketCallable().call(req, merge), - Decoder.identity()); - return true; - } catch (StorageException e) { - return false; - } + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + return Boolean.TRUE.equals( + Retrying.run( + getOptions(), + retryAlgorithmManager.getFor(req), + () -> { + try { + storageClient.deleteBucketCallable().call(req, merge); + return true; + } catch (NotFoundException e) { + return false; + } + }, + Decoder.identity())); } @Override @@ -716,8 +746,10 @@ public GrpcBlobReadChannel reader(BlobId blob, BlobSourceOption... options) { ReadObjectRequest request = getReadObjectRequest(blob, opts); Set codes = resultRetryAlgorithmToCodes(retryAlgorithmManager.getFor(request)); GrpcCallContext grpcCallContext = Retrying.newCallContext().withRetryableCodes(codes); + return new GrpcBlobReadChannel( storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext), + responseContentLifecycleManager, request, !opts.autoGzipDecompression()); } @@ -755,11 +787,19 @@ public GrpcBlobWriteChannel writer(BlobInfo blobInfo, BlobWriteOption... options opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault()); WriteObjectRequest req = getWriteObjectRequest(blobInfo, opts); Hasher hasher = Hasher.noop(); + // in JSON, the starting of the resumable session happens before the invocation of write can + // happen. Emulate the same thing here. + // 1. create the future + ApiFuture startResumableWrite = startResumableWrite(grpcCallContext, req); + // 2. await the result of the future + ResumableWrite resumableWrite = ApiFutureUtils.await(startResumableWrite); + // 3. wrap the result in another future container before constructing the BlobWriteChannel + ApiFuture wrapped = ApiFutures.immediateFuture(resumableWrite); return new GrpcBlobWriteChannel( storageClient.writeObjectCallable(), getOptions(), retryAlgorithmManager.idempotent(), - () -> startResumableWrite(grpcCallContext, req), + () -> wrapped, hasher); } @@ -1868,7 +1908,9 @@ private UnbufferedReadableByteChannelSession unbufferedReadSession( opts.grpcMetadataMapper().apply(Retrying.newCallContext().withRetryableCodes(codes)); return ResumableMedia.gapic() .read() - .byteChannel(storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext)) + .byteChannel( + storageClient.readObjectCallable().withDefaultCallContext(grpcCallContext), + responseContentLifecycleManager) .setAutoGzipDecompression(!opts.autoGzipDecompression()) .unbuffered() .setReadObjectRequest(readObjectRequest) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java index 841343d311..438b5fd595 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java @@ -25,14 +25,20 @@ import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.FixedCredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GrpcCallSettings; import com.google.api.gax.grpc.GrpcInterceptorProvider; +import com.google.api.gax.grpc.GrpcStubCallableFactory; import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.retrying.StreamResumptionStrategy; +import com.google.api.gax.rpc.ClientContext; import com.google.api.gax.rpc.HeaderProvider; import com.google.api.gax.rpc.NoHeaderProvider; +import com.google.api.gax.rpc.RequestParamsBuilder; +import com.google.api.gax.rpc.ServerStreamingCallable; import com.google.api.gax.rpc.StatusCode.Code; import com.google.api.gax.rpc.internal.QuotaProjectIdHidingCredentials; +import com.google.api.pathtemplate.PathTemplate; import com.google.auth.Credentials; import com.google.cloud.NoCredentials; import com.google.cloud.ServiceFactory; @@ -47,25 +53,50 @@ import com.google.cloud.storage.UnifiedOpts.Opts; import com.google.cloud.storage.UnifiedOpts.UserProject; import com.google.cloud.storage.spi.StorageRpcFactory; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.protobuf.ByteString; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.MessageLite; +import com.google.protobuf.Parser; +import com.google.protobuf.UnsafeByteOperations; import com.google.storage.v2.ReadObjectRequest; import com.google.storage.v2.ReadObjectResponse; import com.google.storage.v2.StorageClient; import com.google.storage.v2.StorageSettings; +import com.google.storage.v2.stub.GrpcStorageCallableFactory; +import com.google.storage.v2.stub.GrpcStorageStub; +import com.google.storage.v2.stub.StorageStub; +import com.google.storage.v2.stub.StorageStubSettings; import io.grpc.ClientInterceptor; +import io.grpc.Detachable; +import io.grpc.HasByteBuffer; +import io.grpc.KnownLength; import io.grpc.ManagedChannelBuilder; +import io.grpc.MethodDescriptor; +import io.grpc.Status; +import io.grpc.protobuf.ProtoUtils; +import java.io.Closeable; import java.io.IOException; +import java.io.InputStream; import java.io.Serializable; import java.net.URI; +import java.nio.ByteBuffer; import java.time.Clock; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Set; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -658,11 +689,32 @@ public Storage create(StorageOptions options) { Tuple> t = grpcStorageOptions.resolveSettingsAndOpts(); StorageSettings storageSettings = t.x(); Opts defaultOpts = t.y(); - return new GrpcStorageImpl( - grpcStorageOptions, - StorageClient.create(storageSettings), - grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), - defaultOpts); + if (ZeroCopyReadinessChecker.isReady()) { + StorageStubSettings stubSettings = + (StorageStubSettings) storageSettings.getStubSettings(); + ClientContext clientContext = ClientContext.create(stubSettings); + GrpcStorageCallableFactory grpcStorageCallableFactory = + new GrpcStorageCallableFactory(); + InternalZeroCopyGrpcStorageStub stub = + new InternalZeroCopyGrpcStorageStub( + stubSettings, clientContext, grpcStorageCallableFactory); + StorageClient client = new InternalStorageClient(stub); + return new GrpcStorageImpl( + grpcStorageOptions, + client, + stub.getObjectMediaResponseMarshaller, + grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), + defaultOpts); + } else { + StorageClient client = StorageClient.create(storageSettings); + return new GrpcStorageImpl( + grpcStorageOptions, + client, + ResponseContentLifecycleManager.noop(), + grpcStorageOptions.blobWriteSessionConfig.createFactory(Clock.systemUTC()), + defaultOpts); + } + } catch (IOException e) { throw new IllegalStateException( "Unable to instantiate gRPC com.google.cloud.storage.Storage client.", e); @@ -780,4 +832,241 @@ private Object readResolve() { return INSTANCE; } } + + private static final class InternalStorageClient extends StorageClient { + + private InternalStorageClient(StorageStub stub) { + super(stub); + } + } + + private static final class InternalZeroCopyGrpcStorageStub extends GrpcStorageStub + implements AutoCloseable { + private final ReadObjectResponseZeroCopyMessageMarshaller getObjectMediaResponseMarshaller; + + private final ServerStreamingCallable + serverStreamingCallable; + + private InternalZeroCopyGrpcStorageStub( + StorageStubSettings settings, + ClientContext clientContext, + GrpcStubCallableFactory callableFactory) + throws IOException { + super(settings, clientContext, callableFactory); + + this.getObjectMediaResponseMarshaller = + new ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse.getDefaultInstance()); + + MethodDescriptor readObjectMethodDescriptor = + MethodDescriptor.newBuilder() + .setType(MethodDescriptor.MethodType.SERVER_STREAMING) + .setFullMethodName("google.storage.v2.Storage/ReadObject") + .setRequestMarshaller(ProtoUtils.marshaller(ReadObjectRequest.getDefaultInstance())) + .setResponseMarshaller(getObjectMediaResponseMarshaller) + .build(); + + GrpcCallSettings readObjectTransportSettings = + GrpcCallSettings.newBuilder() + .setMethodDescriptor(readObjectMethodDescriptor) + .setParamsExtractor( + request -> { + RequestParamsBuilder builder = RequestParamsBuilder.create(); + // todo: this is fragile to proto annotation changes, and would require manual + // maintenance + builder.add(request.getBucket(), "bucket", PathTemplate.create("{bucket=**}")); + return builder.build(); + }) + .build(); + + this.serverStreamingCallable = + callableFactory.createServerStreamingCallable( + readObjectTransportSettings, settings.readObjectSettings(), clientContext); + } + + @Override + public ServerStreamingCallable readObjectCallable() { + return serverStreamingCallable; + } + } + + @VisibleForTesting + static class ReadObjectResponseZeroCopyMessageMarshaller + implements MethodDescriptor.PrototypeMarshaller, + ResponseContentLifecycleManager, + Closeable { + private final Map unclosedStreams; + private final Parser parser; + private final MethodDescriptor.PrototypeMarshaller baseMarshaller; + + ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse defaultInstance) { + parser = defaultInstance.getParserForType(); + baseMarshaller = + (MethodDescriptor.PrototypeMarshaller) + ProtoUtils.marshaller(defaultInstance); + unclosedStreams = Collections.synchronizedMap(new IdentityHashMap<>()); + } + + @Override + public Class getMessageClass() { + return baseMarshaller.getMessageClass(); + } + + @Override + public ReadObjectResponse getMessagePrototype() { + return baseMarshaller.getMessagePrototype(); + } + + @Override + public InputStream stream(ReadObjectResponse value) { + return baseMarshaller.stream(value); + } + + @Override + public ReadObjectResponse parse(InputStream stream) { + CodedInputStream cis = null; + try { + if (stream instanceof KnownLength + && stream instanceof Detachable + && stream instanceof HasByteBuffer + && ((HasByteBuffer) stream).byteBufferSupported()) { + int size = stream.available(); + // Stream is now detached here and should be closed later. + stream = ((Detachable) stream).detach(); + // This mark call is to keep buffer while traversing buffers using skip. + stream.mark(size); + List byteStrings = new ArrayList<>(); + while (stream.available() != 0) { + ByteBuffer buffer = ((HasByteBuffer) stream).getByteBuffer(); + byteStrings.add(UnsafeByteOperations.unsafeWrap(buffer)); + stream.skip(buffer.remaining()); + } + stream.reset(); + cis = ByteString.copyFrom(byteStrings).newCodedInput(); + cis.enableAliasing(true); + cis.setSizeLimit(Integer.MAX_VALUE); + } + } catch (IOException e) { + throw Status.INTERNAL + .withDescription("Error parsing input stream for ReadObject") + .withCause(e) + .asRuntimeException(); + } + if (cis != null) { + // fast path (no memory copy) + ReadObjectResponse message; + try { + message = parseFrom(cis); + } catch (InvalidProtocolBufferException ipbe) { + throw Status.INTERNAL + .withDescription("Invalid protobuf byte sequence for ReadObject") + .withCause(ipbe) + .asRuntimeException(); + } + unclosedStreams.put(message, stream); + return message; + } else { + // slow path + return baseMarshaller.parse(stream); + } + } + + private ReadObjectResponse parseFrom(CodedInputStream stream) + throws InvalidProtocolBufferException { + ReadObjectResponse message = parser.parseFrom(stream); + try { + stream.checkLastTagWas(0); + return message; + } catch (InvalidProtocolBufferException e) { + e.setUnfinishedMessage(message); + throw e; + } + } + + @Override + public ResponseContentLifecycleHandle get(ReadObjectResponse response) { + InputStream stream = unclosedStreams.remove(response); + return new ResponseContentLifecycleHandle(response, stream); + } + + @Override + public void close() throws IOException { + closeAllStreams(unclosedStreams.values()); + } + + /** + * In the event closing the streams results in multiple streams throwing IOExceptions, collect + * them all as suppressed exceptions on the first occurrence. + */ + @VisibleForTesting + static void closeAllStreams(Collection inputStreams) throws IOException { + IOException ioException = + inputStreams.stream() + .map( + stream -> { + try { + stream.close(); + return null; + } catch (IOException e) { + return e; + } + }) + .filter(Objects::nonNull) + .reduce( + null, + (l, r) -> { + if (l != null) { + l.addSuppressed(r); + return l; + } else { + return r; + } + }, + (l, r) -> l); + + if (ioException != null) { + throw ioException; + } + } + } + + static final class ZeroCopyReadinessChecker { + private static final boolean isZeroCopyReady; + + static { + // Check whether io.grpc.Detachable exists? + boolean detachableClassExists = false; + try { + // Try to load Detachable interface in the package where KnownLength is in. + // This can be done directly by looking up io.grpc.Detachable but rather + // done indirectly to handle the case where gRPC is being shaded in a + // different package. + String knownLengthClassName = KnownLength.class.getName(); + String detachableClassName = + knownLengthClassName.substring(0, knownLengthClassName.lastIndexOf('.') + 1) + + "Detachable"; + Class detachableClass = Class.forName(detachableClassName); + detachableClassExists = (detachableClass != null); + } catch (ClassNotFoundException ex) { + // leaves detachableClassExists false + } + // Check whether com.google.protobuf.UnsafeByteOperations exists? + boolean unsafeByteOperationsClassExists = false; + try { + // Same above + String messageLiteClassName = MessageLite.class.getName(); + String unsafeByteOperationsClassName = + messageLiteClassName.substring(0, messageLiteClassName.lastIndexOf('.') + 1) + + "UnsafeByteOperations"; + Class unsafeByteOperationsClass = Class.forName(unsafeByteOperationsClassName); + unsafeByteOperationsClassExists = (unsafeByteOperationsClass != null); + } catch (ClassNotFoundException ex) { + // leaves unsafeByteOperationsClassExists false + } + isZeroCopyReady = detachableClassExists && unsafeByteOperationsClassExists; + } + + public static boolean isReady() { + return isZeroCopyReady; + } + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java index 06fca0413f..d7741b7d91 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Hasher.java @@ -20,6 +20,7 @@ import com.google.common.hash.Hashing; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.List; import java.util.function.Supplier; import javax.annotation.concurrent.Immutable; import org.checkerframework.checker.nullness.qual.Nullable; @@ -36,6 +37,8 @@ default Crc32cLengthKnown hash(Supplier b) { void validate(Crc32cValue expected, Supplier b) throws IOException; + void validate(Crc32cValue expected, List buffers) throws IOException; + @Nullable Crc32cLengthKnown nullSafeConcat(Crc32cLengthKnown r1, Crc32cLengthKnown r2); @@ -61,6 +64,9 @@ public Crc32cLengthKnown hash(ByteBuffer b) { @Override public void validate(Crc32cValue expected, Supplier b) {} + @Override + public void validate(Crc32cValue expected, List b) {} + @Override public @Nullable Crc32cLengthKnown nullSafeConcat(Crc32cLengthKnown r1, Crc32cLengthKnown r2) { return null; @@ -79,7 +85,24 @@ public Crc32cLengthKnown hash(ByteBuffer b) { return Crc32cValue.of(Hashing.crc32c().hashBytes(b).asInt(), remaining); } - @SuppressWarnings("ConstantConditions") + @SuppressWarnings({"ConstantConditions", "UnstableApiUsage"}) + @Override + public void validate(Crc32cValue expected, List b) throws IOException { + long remaining = 0; + com.google.common.hash.Hasher crc32c = Hashing.crc32c().newHasher(); + for (ByteBuffer tmp : b) { + remaining += tmp.remaining(); + crc32c.putBytes(tmp); + } + Crc32cLengthKnown actual = Crc32cValue.of(crc32c.hash().asInt(), remaining); + if (!actual.eqValue(expected)) { + throw new IOException( + String.format( + "Mismatch checksum value. Expected %s actual %s", + expected.debugString(), actual.debugString())); + } + } + @Override public void validate(Crc32cValue expected, Supplier b) throws IOException { Crc32cLengthKnown actual = hash(b); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java index fd2a573119..684f3f15b7 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpStorageOptions.java @@ -16,6 +16,7 @@ package com.google.cloud.storage; +import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.api.core.ApiClock; @@ -30,6 +31,7 @@ import com.google.cloud.http.HttpTransportOptions; import com.google.cloud.spi.ServiceRpcFactory; import com.google.cloud.storage.Retrying.RetryingDependencies; +import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.spi.StorageRpcFactory; import com.google.cloud.storage.spi.v1.HttpStorageRpc; @@ -39,7 +41,9 @@ import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; +import java.time.Clock; import java.util.Set; +import org.checkerframework.checker.nullness.qual.NonNull; /** @since 2.14.0 This new api is in preview and is subject to breaking changes. */ @BetaApi @@ -55,6 +59,7 @@ public class HttpStorageOptions extends StorageOptions { private final HttpRetryAlgorithmManager retryAlgorithmManager; private transient RetryDependenciesAdapter retryDepsAdapter; + private final BlobWriteSessionConfig blobWriteSessionConfig; private HttpStorageOptions(Builder builder, StorageDefaults serviceDefaults) { super(builder, serviceDefaults); @@ -63,6 +68,7 @@ private HttpStorageOptions(Builder builder, StorageDefaults serviceDefaults) { MoreObjects.firstNonNull( builder.storageRetryStrategy, defaults().getStorageRetryStrategy())); retryDepsAdapter = new RetryDependenciesAdapter(); + blobWriteSessionConfig = builder.blobWriteSessionConfig; } @Override @@ -120,6 +126,8 @@ RetryingDependencies asRetryDependencies() { public static class Builder extends StorageOptions.Builder { private StorageRetryStrategy storageRetryStrategy; + private BlobWriteSessionConfig blobWriteSessionConfig = + HttpStorageDefaults.INSTANCE.getDefaultStorageWriterConfig(); Builder() {} @@ -218,6 +226,24 @@ public HttpStorageOptions.Builder setQuotaProjectId(String quotaProjectId) { return this; } + /** + * @see BlobWriteSessionConfig + * @see BlobWriteSessionConfigs + * @see Storage#blobWriteSession(BlobInfo, BlobWriteOption...) + * @see HttpStorageDefaults#getDefaultStorageWriterConfig() + * @since 2.29.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public HttpStorageOptions.Builder setBlobWriteSessionConfig( + @NonNull BlobWriteSessionConfig blobWriteSessionConfig) { + requireNonNull(blobWriteSessionConfig, "blobWriteSessionConfig must be non null"); + checkArgument( + blobWriteSessionConfig instanceof BlobWriteSessionConfig.HttpCompatible, + "The provided instance of BlobWriteSessionConfig is not compatible with this HTTP transport."); + this.blobWriteSessionConfig = blobWriteSessionConfig; + return this; + } + @Override public HttpStorageOptions build() { return new HttpStorageOptions(this, defaults()); @@ -249,6 +275,12 @@ public HttpTransportOptions getDefaultTransportOptions() { public StorageRetryStrategy getStorageRetryStrategy() { return StorageRetryStrategy.getDefaultStorageRetryStrategy(); } + + /** @since 2.29.0 This new api is in preview and is subject to breaking changes. */ + @BetaApi + public BlobWriteSessionConfig getDefaultStorageWriterConfig() { + return BlobWriteSessionConfigs.getDefault(); + } } /** @@ -287,7 +319,14 @@ public HttpStorageFactory() {} public Storage create(StorageOptions options) { if (options instanceof HttpStorageOptions) { HttpStorageOptions httpStorageOptions = (HttpStorageOptions) options; - return new StorageImpl(httpStorageOptions); + Clock clock = Clock.systemUTC(); + try { + return new StorageImpl( + httpStorageOptions, httpStorageOptions.blobWriteSessionConfig.createFactory(clock)); + } catch (IOException e) { + throw new IllegalStateException( + "Unable to instantiate HTTP com.google.cloud.storage.Storage client.", e); + } } else { throw new IllegalArgumentException("Only HttpStorageOptions supported"); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java index 0b6249ca8c..2e87117800 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionFailureScenario.java @@ -64,8 +64,7 @@ enum JsonResumableSessionFailureScenario { SCENARIO_7( BaseServiceException.UNKNOWN_CODE, "dataLoss", - "Client side data loss detected. Bytes acked is more than client sent."), - SCENARIO_9(503, "backendNotConnected", "Ack less than bytes sent"); + "Client side data loss detected. Bytes acked is more than client sent."); private static final String PREFIX_I = "\t|< "; private static final String PREFIX_O = "\t|> "; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java index 3f5e6ccb63..622988d4cb 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSessionPutTask.java @@ -109,10 +109,9 @@ public void rewindTo(long offset) { success = true; return ResumableOperationResult.incremental(ackRange.endOffset()); } else if (ackRange.endOffset() < effectiveEnd) { - StorageException se = - JsonResumableSessionFailureScenario.SCENARIO_9.toStorageException(uploadId, response); - span.setStatus(Status.UNKNOWN.withDescription(se.getMessage())); - throw se; + rewindTo(ackRange.endOffset()); + success = true; + return ResumableOperationResult.incremental(ackRange.endOffset()); } else { StorageException se = JsonResumableSessionFailureScenario.SCENARIO_7.toStorageException(uploadId, response); @@ -121,7 +120,7 @@ public void rewindTo(long offset) { } } else if (finalizing && JsonResumableSessionFailureScenario.isOk(code)) { @Nullable StorageObject storageObject; - @Nullable BigInteger actualSize; + BigInteger actualSize = BigInteger.ZERO; Long contentLength = response.getHeaders().getContentLength(); String contentType = response.getHeaders().getContentType(); @@ -131,7 +130,12 @@ public void rewindTo(long offset) { boolean isJson = contentType != null && contentType.startsWith("application/json"); if (isJson) { storageObject = response.parseAs(StorageObject.class); - actualSize = storageObject != null ? storageObject.getSize() : null; + if (storageObject != null) { + BigInteger size = storageObject.getSize(); + if (size != null) { + actualSize = size; + } + } } else if ((contentLength == null || contentLength == 0) && storedContentLength != null) { // when a signed url is used, the finalize response is empty response.ignore(); @@ -151,7 +155,6 @@ public void rewindTo(long offset) { int compare = expectedSize.compareTo(actualSize); if (compare == 0) { success = true; - //noinspection DataFlowIssue compareTo result will filter out actualSize == null return ResumableOperationResult.complete(storageObject, actualSize.longValue()); } else if (compare > 0) { StorageException se = diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java index 07551abe4f..41f52c0958 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadBlobWriteSessionConfig.java @@ -118,9 +118,9 @@ */ @Immutable @BetaApi -@TransportCompatibility({Transport.GRPC}) +@TransportCompatibility({Transport.GRPC, Transport.HTTP}) public final class ParallelCompositeUploadBlobWriteSessionConfig extends BlobWriteSessionConfig - implements BlobWriteSessionConfig.GrpcCompatible { + implements BlobWriteSessionConfig.HttpCompatible, BlobWriteSessionConfig.GrpcCompatible { private static final int MAX_PARTS_PER_COMPOSE = 32; private final int maxPartsPerCompose; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java index 639802cde6..a0dce2cfe4 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannel.java @@ -431,6 +431,10 @@ private BlobInfo definePart(BlobInfo ultimateObject, PartRange partRange, long o PART_INDEX.appendTo(partRange, builder); OBJECT_OFFSET.appendTo(offset, builder); b.setMetadata(builder.build()); + // the value of a kms key name will contain the exact version when read from gcs + // however, gcs will not accept that version resource identifier when creating a new object + // strip it out, so it can be included as a query string parameter instead + b.setKmsKeyName(null); b = partMetadataFieldDecorator.apply(b); return b.build(); } @@ -507,7 +511,11 @@ private ApiFuture deleteAsync(BlobId id) { @VisibleForTesting @NonNull static Opts getPartOpts(Opts opts) { - return opts.filter(TO_EXCLUDE_FROM_PARTS).prepend(DOES_NOT_EXIST); + return opts.filter(TO_EXCLUDE_FROM_PARTS) + .prepend(DOES_NOT_EXIST) + // disable gzip transfer encoding for HTTP, it causes a significant bottleneck uploading + // the parts + .prepend(Opts.from(UnifiedOpts.disableGzipContent())); } @VisibleForTesting diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java new file mode 100644 index 0000000000..b65a6e257b --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ReadCursor.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * Shrink wraps a beginning, offset and limit for tracking state of an individual invocation of + * {@link #read} + */ +final class ReadCursor { + private final long beginning; + private long offset; + private final long limit; + + ReadCursor(long beginning, long limit) { + this.limit = limit; + this.beginning = beginning; + this.offset = beginning; + } + + public boolean hasRemaining() { + return limit - offset > 0; + } + + public void advance(long incr) { + checkArgument(incr >= 0); + offset += incr; + } + + public long read() { + return offset - beginning; + } + + @Override + public String toString() { + return String.format("ReadCursor{begin=%d, offset=%d, limit=%d}", beginning, offset, limit); + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java new file mode 100644 index 0000000000..20fc365832 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleHandle.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import com.google.storage.v2.ReadObjectResponse; +import java.io.Closeable; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.List; +import org.checkerframework.checker.nullness.qual.Nullable; + +final class ResponseContentLifecycleHandle implements Closeable { + @Nullable private final Closeable dispose; + + private final List buffers; + + ResponseContentLifecycleHandle(ReadObjectResponse resp, @Nullable Closeable dispose) { + this.dispose = dispose; + + this.buffers = resp.getChecksummedData().getContent().asReadOnlyByteBufferList(); + } + + void copy(ReadCursor c, ByteBuffer[] dsts, int offset, int length) { + for (ByteBuffer b : buffers) { + long copiedBytes = Buffers.copy(b, dsts, offset, length); + c.advance(copiedBytes); + if (b.hasRemaining()) break; + } + } + + boolean hasRemaining() { + for (ByteBuffer b : buffers) { + if (b.hasRemaining()) return true; + } + return false; + } + + @Override + public void close() throws IOException { + if (dispose != null) { + dispose.close(); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java new file mode 100644 index 0000000000..3236513398 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ResponseContentLifecycleManager.java @@ -0,0 +1,31 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import com.google.storage.v2.ReadObjectResponse; + +interface ResponseContentLifecycleManager { + ResponseContentLifecycleHandle get(ReadObjectResponse response); + + static ResponseContentLifecycleManager noop() { + return response -> + new ResponseContentLifecycleHandle( + response, + () -> { + // no-op + }); + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java new file mode 100644 index 0000000000..0d2ff144b9 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/RewindableContentInputStream.java @@ -0,0 +1,91 @@ +/* + * Copyright 2023 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.google.cloud.storage; + +import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.GatheringByteChannel; + +/** + * Facade which makes an instance of {@link RewindableContent} appear as an input stream. + * + *

        It does this by calling {@link RewindableContent#writeTo(GatheringByteChannel)} on an + * anonymous channel which closes over the read destination. + */ +final class RewindableContentInputStream extends InputStream { + + private final RewindableContent content; + + RewindableContentInputStream(RewindableContent content) { + this.content = content; + } + + @Override + public int read() throws IOException { + byte[] tmp = new byte[1]; + int read = read(tmp); + if (read == -1) { + return -1; + } else { + return tmp[0] & 0xFF; + } + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + // define a byte buffer as the destination for our write + ByteBuffer dst = ByteBuffer.wrap(b, off, len); + int remaining = dst.remaining(); + if (remaining == 0) { + return 0; + } + long written = + content.writeTo( + new AnonWritableByteChannel() { + @Override + public long write(ByteBuffer[] srcs, int offset, int length) { + // srcs here is the bytes of content + long total = 0; + for (int i = offset; i < length; i++) { + ByteBuffer src = srcs[i]; + // copy what we can from our src to the dst buffer + long written = Buffers.copy(src, dst); + total += written; + } + return total; + } + }); + // if the dst has space, but we didn't write anything means we didn't have anything to write + if (written == 0) { + return -1; + } + return Math.toIntExact(written); + } + + private abstract static class AnonWritableByteChannel implements UnbufferedWritableByteChannel { + + @Override + public boolean isOpen() { + return true; + } + + @Override + public void close() {} + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java index f8b4f94a8d..eeb24a44b8 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageException.java @@ -118,6 +118,9 @@ static BaseServiceException coalesce(Throwable t) { if (t instanceof ApiException) { return asStorageException((ApiException) t); } + if (t.getCause() instanceof ApiException) { + return asStorageException((ApiException) t.getCause()); + } return getStorageException(t); } 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 a5df68b832..5884a51e52 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 @@ -38,6 +38,7 @@ import com.google.cloud.WriteChannel; import com.google.cloud.storage.Acl.Entity; import com.google.cloud.storage.BlobReadChannelV2.BlobReadChannelContext; +import com.google.cloud.storage.BlobWriteSessionConfig.WriterFactory; import com.google.cloud.storage.HmacKey.HmacKeyMetadata; import com.google.cloud.storage.PostPolicyV4.ConditionV4Type; import com.google.cloud.storage.PostPolicyV4.PostConditionsV4; @@ -90,9 +91,10 @@ import java.util.concurrent.TimeoutException; import java.util.function.Function; import java.util.function.Supplier; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -final class StorageImpl extends BaseService implements Storage { +final class StorageImpl extends BaseService implements Storage, StorageInternal { private static final byte[] EMPTY_BYTE_ARRAY = {}; private static final String EMPTY_BYTE_ARRAY_MD5 = "1B2M2Y8AsgTpgAmY7PhCfg=="; @@ -115,11 +117,13 @@ final class StorageImpl extends BaseService implements Storage { final HttpRetryAlgorithmManager retryAlgorithmManager; final StorageRpc storageRpc; + final WriterFactory writerFactory; - StorageImpl(HttpStorageOptions options) { + StorageImpl(HttpStorageOptions options, WriterFactory writerFactory) { super(options); this.retryAlgorithmManager = options.getRetryAlgorithmManager(); this.storageRpc = options.getStorageRpcV1(); + this.writerFactory = writerFactory; } @Override @@ -144,7 +148,8 @@ public Blob create(BlobInfo blobInfo, BlobTargetOption... options) { .setMd5(EMPTY_BYTE_ARRAY_MD5) .setCrc32c(EMPTY_BYTE_ARRAY_CRC32C) .build(); - return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, 0, 0, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, EMPTY_BYTE_ARRAY, 0, 0, objectTargetOptOpts); } @Override @@ -158,7 +163,8 @@ public Blob create(BlobInfo blobInfo, byte[] content, BlobTargetOption... option BaseEncoding.base64() .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(content).asInt()))) .build(); - return internalCreate(updatedInfo, content, 0, content.length, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, content, 0, content.length, objectTargetOptOpts); } @Override @@ -177,7 +183,8 @@ public Blob create( Ints.toByteArray( Hashing.crc32c().hashBytes(content, offset, length).asInt()))) .build(); - return internalCreate(updatedInfo, content, offset, length, options); + final Opts objectTargetOptOpts = Opts.unwrap(options).resolveFrom(updatedInfo); + return internalCreate(updatedInfo, content, offset, length, objectTargetOptOpts); } @Override @@ -200,12 +207,11 @@ public Blob create(BlobInfo blobInfo, InputStream content, BlobWriteOption... op private Blob internalCreate( BlobInfo info, - final byte[] content, + final byte @NonNull [] content, final int offset, final int length, - BlobTargetOption... options) { + Opts opts) { Preconditions.checkNotNull(content); - Opts opts = Opts.unwrap(options).resolveFrom(info); final Map optionsMap = opts.getRpcOptions(); BlobInfo updated = opts.blobInfoMapper().apply(info.toBuilder()).build(); @@ -1635,4 +1641,125 @@ private Bucket internalBucketGet(String bucket, Map option () -> storageRpc.get(bucketPb, optionsMap), (b) -> Conversions.json().bucketInfo().decode(b).asBucket(this)); } + + @Override + public BlobWriteSession blobWriteSession(BlobInfo blobInfo, BlobWriteOption... options) { + Opts opts = Opts.unwrap(options).resolveFrom(blobInfo); + + WritableByteChannelSession writableByteChannelSession = + writerFactory.writeSession(this, blobInfo, opts); + return BlobWriteSessions.of(writableByteChannelSession); + } + + @Override + public BlobInfo internalCreateFrom(Path path, BlobInfo info, Opts opts) + throws IOException { + if (Files.isDirectory(path)) { + throw new StorageException(0, path + " is a directory"); + } + long size = Files.size(path); + if (size == 0L) { + return internalCreate(info, EMPTY_BYTE_ARRAY, 0, 0, opts); + } + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = info.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + StorageObject encode = codecs.blobInfo().encode(updated); + + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + getOptions(), + updated, + optionsMap, + retryAlgorithmManager.getForResumableUploadSessionCreate(optionsMap)); + JsonResumableWrite jsonResumableWrite = + JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + + JsonResumableSession session = + ResumableSession.json( + HttpClientContext.from(storageRpc), + getOptions().asRetryDependencies(), + retryAlgorithmManager.idempotent(), + jsonResumableWrite); + HttpContentRange contentRange = + HttpContentRange.of(ByteRangeSpec.relativeLength(0L, size), size); + ResumableOperationResult put = + session.put(RewindableContent.of(path), contentRange); + // all exception translation is taken care of down in the JsonResumableSession + StorageObject object = put.getObject(); + if (object == null) { + // if by some odd chance the put didn't get the StorageObject, query for it + ResumableOperationResult query = session.query(); + object = query.getObject(); + } + return codecs.blobInfo().decode(object); + } + + @Override + public BlobInfo internalDirectUpload(BlobInfo info, Opts opts, ByteBuffer buf) { + + BlobInfo.Builder builder = + info.toBuilder() + .setMd5( + BaseEncoding.base64().encode(Hashing.md5().hashBytes(buf.duplicate()).asBytes())) + .setCrc32c( + BaseEncoding.base64() + .encode(Ints.toByteArray(Hashing.crc32c().hashBytes(buf.duplicate()).asInt()))); + final Map optionsMap = opts.getRpcOptions(); + + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + final StorageObject encoded = codecs.blobInfo().encode(updated); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsCreate(encoded, optionsMap); + RewindableContent content = RewindableContent.of(buf); + return run( + algorithm, + () -> { + content.rewindTo(0); + return storageRpc.create(encoded, new RewindableContentInputStream(content), optionsMap); + }, + Conversions.json().blobInfo()::decode); + } + + /** + * Behavioral difference compared to {@link #delete(BlobId, BlobSourceOption...)} instead of + * returning false when an object does not exist, we throw an exception. + */ + @Override + public Void internalObjectDelete(BlobId id, Opts opts) { + final StorageObject storageObject = codecs.blobId().encode(id); + ImmutableMap optionsMap = opts.getRpcOptions(); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsDelete(storageObject, optionsMap); + return run( + algorithm, + () -> { + boolean deleted = storageRpc.delete(storageObject, optionsMap); + // HttpStorageRpc turns a 404 into false, our code needs to know 404 + if (!deleted) { + throw new StorageException(404, "NOT_FOUND", null, null); + } + return null; + }, + Function.identity()); + } + + @Override + public BlobInfo internalObjectGet(BlobId blobId, Opts opts) { + StorageObject storedObject = codecs.blobId().encode(blobId); + ImmutableMap optionsMap = opts.getRpcOptions(); + ResultRetryAlgorithm algorithm = + retryAlgorithmManager.getForObjectsGet(storedObject, optionsMap); + return run( + algorithm, + () -> { + StorageObject storageObject = storageRpc.get(storedObject, optionsMap); + // HttpStorageRpc turns a 404 into null, our code needs to know 404 + if (storageObject == null) { + throw new StorageException(404, "NOT_FOUND", null, null); + } + return storageObject; + }, + codecs.blobInfo()::decode); + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java index 53ad6142e9..ab32532ae1 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageOptions.java @@ -22,14 +22,17 @@ import com.google.cloud.ServiceDefaults; import com.google.cloud.ServiceOptions; import com.google.cloud.http.HttpTransportOptions; +import com.google.cloud.storage.GrpcStorageOptions.GrpcStorageDefaults; import com.google.cloud.storage.HttpStorageOptions.HttpStorageDefaults; import com.google.cloud.storage.HttpStorageOptions.HttpStorageFactory; import com.google.cloud.storage.HttpStorageOptions.HttpStorageRpcFactory; +import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.spi.StorageRpcFactory; import java.io.IOException; import java.io.InputStream; import java.util.Properties; +import org.checkerframework.checker.nullness.qual.NonNull; public abstract class StorageOptions extends ServiceOptions { @@ -95,6 +98,18 @@ public abstract static class Builder public abstract Builder setStorageRetryStrategy(StorageRetryStrategy storageRetryStrategy); + /** + * @see BlobWriteSessionConfig + * @see BlobWriteSessionConfigs + * @see Storage#blobWriteSession(BlobInfo, BlobWriteOption...) + * @see HttpStorageDefaults#getDefaultStorageWriterConfig() + * @see GrpcStorageDefaults#getDefaultStorageWriterConfig() + * @since 2.37.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public abstract StorageOptions.Builder setBlobWriteSessionConfig( + @NonNull BlobWriteSessionConfig blobWriteSessionConfig); + @Override public abstract StorageOptions build(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java index 06909620d2..16c76ef926 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/UnifiedOpts.java @@ -598,6 +598,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getObjectChecksumsBuilder().setCrc32C(val); + return b; + }; + } + @Override public int hashCode() { return Objects.hash(val); @@ -753,6 +761,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + customerSuppliedKey(b.getCommonObjectRequestParamsBuilder(), val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> { @@ -1045,6 +1061,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfGenerationMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfGenerationMatch(val); @@ -1106,6 +1130,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfGenerationNotMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfGenerationNotMatch(val); @@ -1157,6 +1189,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().getResourceBuilder().setKmsKey(val); + return b; + }; + } + @Override public Mapper composeObject() { return b -> b.setKmsKey(val); @@ -1217,6 +1257,15 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getObjectChecksumsBuilder() + .setMd5Hash(ByteString.copyFrom(BaseEncoding.base64().decode(val))); + return b; + }; + } + @Override public int hashCode() { return Objects.hash(val); @@ -1252,6 +1301,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfMetagenerationMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfMetagenerationMatch(val); @@ -1337,6 +1394,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setIfMetagenerationNotMatch(val); + return b; + }; + } + @Override public Mapper readObject() { return b -> b.setIfMetagenerationNotMatch(val); @@ -1452,6 +1517,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().setPredefinedAcl(val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> b.setPredefinedAcl(val); @@ -1704,6 +1777,14 @@ public Mapper writeObject() { }; } + @Override + public Mapper bidiWriteObject() { + return b -> { + b.getWriteObjectSpecBuilder().getResourceBuilder().setContentType(val); + return b; + }; + } + @Override public Mapper updateObject() { return b -> { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java index 8a97342716..363d9afdde 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/HttpStorageRpc.java @@ -43,6 +43,7 @@ import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.Data; import com.google.api.services.storage.Storage; +import com.google.api.services.storage.Storage.Objects.Compose; import com.google.api.services.storage.Storage.Objects.Get; import com.google.api.services.storage.Storage.Objects.Insert; import com.google.api.services.storage.model.Bucket; @@ -755,13 +756,15 @@ public StorageObject compose( Span span = startSpan(HttpStorageRpcSpans.SPAN_NAME_COMPOSE); Scope scope = tracer.withSpan(span); try { - return storage - .objects() - .compose(target.getBucket(), target.getName(), request) - .setIfMetagenerationMatch(Option.IF_METAGENERATION_MATCH.getLong(targetOptions)) - .setIfGenerationMatch(Option.IF_GENERATION_MATCH.getLong(targetOptions)) - .setUserProject(Option.USER_PROJECT.getString(targetOptions)) - .execute(); + Compose compose = + storage + .objects() + .compose(target.getBucket(), target.getName(), request) + .setIfMetagenerationMatch(Option.IF_METAGENERATION_MATCH.getLong(targetOptions)) + .setIfGenerationMatch(Option.IF_GENERATION_MATCH.getLong(targetOptions)) + .setUserProject(Option.USER_PROJECT.getString(targetOptions)); + setEncryptionHeaders(compose.getRequestHeaders(), ENCRYPTION_KEY_PREFIX, targetOptions); + return compose.execute(); } catch (IOException ex) { span.setStatus(Status.UNKNOWN.withDescription(ex.getMessage())); throw translate(ex); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java index fa1ed0c98a..e466a824eb 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/DefaultQos.java @@ -19,9 +19,16 @@ final class DefaultQos implements Qos { private final long divideAndConquerThreshold; + private final long parallelCompositeUploadThreshold; + private boolean threadThresholdMet; - private DefaultQos(long divideAndConquerThreshold) { + private DefaultQos( + long divideAndConquerThreshold, + long parallelCompositeUploadThreshold, + boolean threadThresholdMet) { this.divideAndConquerThreshold = divideAndConquerThreshold; + this.parallelCompositeUploadThreshold = parallelCompositeUploadThreshold; + this.threadThresholdMet = threadThresholdMet; } @Override @@ -29,11 +36,13 @@ public boolean divideAndConquer(long objectSize) { return objectSize > divideAndConquerThreshold; } - static DefaultQos of() { - return of(128L * 1024 * 1024); + @Override + public boolean parallelCompositeUpload(long objectSize) { + return threadThresholdMet && objectSize > parallelCompositeUploadThreshold; } - static DefaultQos of(long divideAndConquerThreshold) { - return new DefaultQos(divideAndConquerThreshold); + static DefaultQos of(TransferManagerConfig config) { + return new DefaultQos( + 128L * 1024 * 1024, 4L * config.getPerWorkerBufferSize(), config.getMaxWorkers() > 2); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java new file mode 100644 index 0000000000..d306c4a6cf --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/ParallelCompositeUploadCallable.java @@ -0,0 +1,94 @@ +/* + * Copyright 2024 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.google.cloud.storage.transfermanager; + +import com.google.api.core.ApiFuture; +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSession; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.Storage.BlobWriteOption; +import com.google.cloud.storage.StorageException; +import com.google.common.io.ByteStreams; +import java.nio.channels.FileChannel; +import java.nio.channels.WritableByteChannel; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +final class ParallelCompositeUploadCallable implements Callable { + private final Storage storage; + + private final BlobInfo originalBlob; + + private final Path sourceFile; + + private final ParallelUploadConfig parallelUploadConfig; + + private final Storage.BlobWriteOption[] opts; + + public ParallelCompositeUploadCallable( + Storage storage, + BlobInfo originalBlob, + Path sourceFile, + ParallelUploadConfig parallelUploadConfig, + BlobWriteOption[] opts) { + this.storage = storage; + this.originalBlob = originalBlob; + this.sourceFile = sourceFile; + this.parallelUploadConfig = parallelUploadConfig; + this.opts = opts; + } + + public UploadResult call() { + return uploadPCU(); + } + + private UploadResult uploadPCU() { + BlobWriteSession session = storage.blobWriteSession(originalBlob, opts); + try (WritableByteChannel writableByteChannel = session.open(); + FileChannel fc = FileChannel.open(sourceFile, StandardOpenOption.READ)) { + ByteStreams.copy(fc, writableByteChannel); + } catch (StorageException e) { + if (parallelUploadConfig.isSkipIfExists() && e.getCode() == 412) { + return UploadResult.newBuilder(originalBlob, TransferStatus.SKIPPED) + .setException(e) + .build(); + } else { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + } catch (Exception e) { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + try { + ApiFuture result = session.getResult(); + BlobInfo newBlob = result.get(10, TimeUnit.SECONDS); + return UploadResult.newBuilder(originalBlob, TransferStatus.SUCCESS) + .setUploadedBlob(newBlob) + .build(); + } catch (InterruptedException | ExecutionException | TimeoutException e) { + return UploadResult.newBuilder(originalBlob, TransferStatus.FAILED_TO_FINISH) + .setException(e) + .build(); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java index 100591648d..492cf3d1f2 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/Qos.java @@ -19,4 +19,6 @@ interface Qos { boolean divideAndConquer(long objectSize); + + boolean parallelCompositeUpload(long objectSize); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java index f333deca69..9aae23454a 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManager.java @@ -18,6 +18,7 @@ import com.google.api.core.BetaApi; import com.google.cloud.storage.BlobInfo; +import java.io.IOException; import java.nio.file.Path; import java.util.List; import org.checkerframework.checker.nullness.qual.NonNull; @@ -58,7 +59,7 @@ public interface TransferManager extends AutoCloseable { */ @BetaApi @NonNull - UploadJob uploadFiles(List files, ParallelUploadConfig config); + UploadJob uploadFiles(List files, ParallelUploadConfig config) throws IOException; /** * Downloads a list of blobs in parallel. This operation will not block the invoking thread, diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java index 835d527197..f06839dd9b 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerConfig.java @@ -30,22 +30,22 @@ public final class TransferManagerConfig { private final int maxWorkers; private final int perWorkerBufferSize; - private final boolean allowDivideAndConquer; + private final boolean allowDivideAndConquerDownload; + private final boolean allowParallelCompositeUpload; private final StorageOptions storageOptions; - private final Qos qos; TransferManagerConfig( int maxWorkers, int perWorkerBufferSize, - boolean allowDivideAndConquer, - StorageOptions storageOptions, - Qos qos) { + boolean allowDivideAndConquerDownload, + boolean allowParallelCompositeUpload, + StorageOptions storageOptions) { this.maxWorkers = maxWorkers; this.perWorkerBufferSize = perWorkerBufferSize; - this.allowDivideAndConquer = allowDivideAndConquer; + this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; + this.allowParallelCompositeUpload = allowParallelCompositeUpload; this.storageOptions = storageOptions; - this.qos = qos; } /** @@ -72,11 +72,30 @@ public int getPerWorkerBufferSize() { * Whether to allow Transfer Manager to perform chunked Uploads/Downloads if it determines * chunking will be beneficial * - * @see Builder#setAllowDivideAndConquer(boolean) + * @see Builder#setAllowDivideAndConquerDownload(boolean) */ @BetaApi - public boolean isAllowDivideAndConquer() { - return allowDivideAndConquer; + public boolean isAllowDivideAndConquerDownload() { + return allowDivideAndConquerDownload; + } + /** + * Whether to allow Transfer Manager to perform Parallel Composite Uploads if it determines + * chunking will be beneficial + * + * @see Builder#setAllowParallelCompositeUpload(boolean) + *

        Note: Performing parallel composite uploads costs more money. Class A operations + * are performed to create each part and to perform each compose. If a storage tier other than + * STANDARD + * is used, early deletion fees apply to deletion of the parts. + *

        Please see the Parallel composite + * uploads documentation for a more in depth explanation of the limitations of Parallel + * composite uploads. + */ + @BetaApi + public boolean isAllowParallelCompositeUpload() { + return allowParallelCompositeUpload; } /** @@ -92,23 +111,19 @@ public StorageOptions getStorageOptions() { /** The service object for {@link TransferManager} */ @BetaApi public TransferManager getService() { - return new TransferManagerImpl(this); + return new TransferManagerImpl(this, DefaultQos.of(this)); } @BetaApi public Builder toBuilder() { return new Builder() - .setAllowDivideAndConquer(allowDivideAndConquer) + .setAllowDivideAndConquerDownload(allowDivideAndConquerDownload) + .setAllowParallelCompositeUpload(allowParallelCompositeUpload) .setMaxWorkers(maxWorkers) .setPerWorkerBufferSize(perWorkerBufferSize) - .setQos(qos) .setStorageOptions(storageOptions); } - Qos getQos() { - return qos; - } - @Override public boolean equals(Object o) { if (this == o) { @@ -120,13 +135,19 @@ public boolean equals(Object o) { TransferManagerConfig that = (TransferManagerConfig) o; return maxWorkers == that.maxWorkers && perWorkerBufferSize == that.perWorkerBufferSize - && allowDivideAndConquer == that.allowDivideAndConquer + && allowDivideAndConquerDownload == that.allowDivideAndConquerDownload + && allowParallelCompositeUpload == that.allowParallelCompositeUpload && Objects.equals(storageOptions, that.storageOptions); } @Override public int hashCode() { - return Objects.hash(maxWorkers, perWorkerBufferSize, allowDivideAndConquer, storageOptions); + return Objects.hash( + maxWorkers, + perWorkerBufferSize, + allowDivideAndConquerDownload, + allowParallelCompositeUpload, + storageOptions); } @Override @@ -134,7 +155,8 @@ public String toString() { return MoreObjects.toStringHelper(this) .add("maxWorkers", maxWorkers) .add("perWorkerBufferSize", perWorkerBufferSize) - .add("allowChunking", allowDivideAndConquer) + .add("allowDivideAndConquerDownload", allowDivideAndConquerDownload) + .add("allowParallelCompositeUpload", allowParallelCompositeUpload) .add("storageOptions", storageOptions) .toString(); } @@ -154,17 +176,17 @@ public static class Builder { private int maxWorkers; private int perWorkerBufferSize; - private boolean allowDivideAndConquer; + private boolean allowDivideAndConquerDownload; + private boolean allowParallelCompositeUpload; private StorageOptions storageOptions; - private Qos qos; private Builder() { this.perWorkerBufferSize = 16 * 1024 * 1024; this.maxWorkers = 2 * Runtime.getRuntime().availableProcessors(); - this.allowDivideAndConquer = false; + this.allowDivideAndConquerDownload = false; + this.allowParallelCompositeUpload = false; this.storageOptions = StorageOptions.getDefaultInstance(); - this.qos = DefaultQos.of(); } /** @@ -202,12 +224,27 @@ public Builder setPerWorkerBufferSize(int perWorkerBufferSize) { * *

        Default Value: false * - * @return the instance of Builder with the value for allowDivideAndConquer modified. - * @see TransferManagerConfig#isAllowDivideAndConquer() + * @return the instance of Builder with the value for allowDivideAndConquerDownload modified. + * @see TransferManagerConfig#isAllowDivideAndConquerDownload() + */ + @BetaApi + public Builder setAllowDivideAndConquerDownload(boolean allowDivideAndConquerDownload) { + this.allowDivideAndConquerDownload = allowDivideAndConquerDownload; + return this; + } + + /** + * Whether to allow Transfer Manager to perform Parallel Composite Uploads if it determines + * chunking will be beneficial + * + *

        Default Value: false + * + * @return the instance of Builder with the value for allowDivideAndConquerDownload modified. + * @see TransferManagerConfig#isAllowDivideAndConquerDownload() */ @BetaApi - public Builder setAllowDivideAndConquer(boolean allowDivideAndConquer) { - this.allowDivideAndConquer = allowDivideAndConquer; + public Builder setAllowParallelCompositeUpload(boolean allowParallelCompositeUpload) { + this.allowParallelCompositeUpload = allowParallelCompositeUpload; return this; } @@ -225,12 +262,6 @@ public Builder setStorageOptions(StorageOptions storageOptions) { return this; } - @BetaApi - Builder setQos(Qos qos) { - this.qos = qos; - return this; - } - /** * Creates a TransferManagerConfig object. * @@ -239,7 +270,11 @@ Builder setQos(Qos qos) { @BetaApi public TransferManagerConfig build() { return new TransferManagerConfig( - maxWorkers, perWorkerBufferSize, allowDivideAndConquer, storageOptions, qos); + maxWorkers, + perWorkerBufferSize, + allowDivideAndConquerDownload, + allowParallelCompositeUpload, + storageOptions); } } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java index 2807d7923f..4bbbeb9393 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/transfermanager/TransferManagerImpl.java @@ -20,9 +20,13 @@ import com.google.api.core.ApiFutures; import com.google.api.core.BetaApi; import com.google.api.core.ListenableFutureToApiFuture; +import com.google.api.core.SettableApiFuture; import com.google.api.gax.rpc.FixedHeaderProvider; import com.google.cloud.storage.BlobId; import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSessionConfigs; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; import com.google.cloud.storage.StorageOptions; @@ -31,10 +35,13 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Deque; import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.BinaryOperator; @@ -50,12 +57,17 @@ final class TransferManagerImpl implements TransferManager { private final Qos qos; private final Storage storage; - TransferManagerImpl(TransferManagerConfig transferManagerConfig) { + private final Deque pcuQueue; + // define a unique object which we can use to synchronize modification of pcuPoller + private final Object pcuPollerSync = new Object(); + private volatile ApiFuture pcuPoller; + + TransferManagerImpl(TransferManagerConfig transferManagerConfig, Qos qos) { this.transferManagerConfig = transferManagerConfig; this.executor = MoreExecutors.listeningDecorator( Executors.newFixedThreadPool(transferManagerConfig.getMaxWorkers())); - this.qos = transferManagerConfig.getQos(); + this.qos = qos; StorageOptions storageOptions = transferManagerConfig.getStorageOptions(); String userAgent = storageOptions.getUserAgent(); if (userAgent == null || !userAgent.contains(USER_AGENT_ENTRY)) { @@ -67,6 +79,14 @@ final class TransferManagerImpl implements TransferManager { ImmutableMap.of("User-Agent", USER_AGENT_ENTRY + LIBRARY_VERSION))) .build(); } + // Create the blobWriteSessionConfig for ParallelCompositeUpload + if (transferManagerConfig.isAllowParallelCompositeUpload()) { + ParallelCompositeUploadBlobWriteSessionConfig pcuConfig = + BlobWriteSessionConfigs.parallelCompositeUpload() + .withExecutorSupplier(ExecutorSupplier.useExecutor(executor)); + storageOptions = storageOptions.toBuilder().setBlobWriteSessionConfig(pcuConfig).build(); + } + this.pcuQueue = new ConcurrentLinkedDeque<>(); this.storage = storageOptions.getService(); } @@ -79,7 +99,8 @@ public void close() throws Exception { @Override @BetaApi - public @NonNull UploadJob uploadFiles(List files, ParallelUploadConfig config) { + public @NonNull UploadJob uploadFiles(List files, ParallelUploadConfig config) + throws IOException { Storage.BlobWriteOption[] opts = config.getWriteOptsPerRequest().toArray(new BlobWriteOption[0]); List> uploadTasks = new ArrayList<>(); @@ -87,9 +108,19 @@ public void close() throws Exception { if (Files.isDirectory(file)) throw new IllegalStateException("Directories are not supported"); String blobName = TransferManagerUtils.createBlobName(config, file); BlobInfo blobInfo = BlobInfo.newBuilder(config.getBucketName(), blobName).build(); - UploadCallable callable = - new UploadCallable(transferManagerConfig, storage, blobInfo, file, config, opts); - uploadTasks.add(convert(executor.submit(callable))); + if (transferManagerConfig.isAllowParallelCompositeUpload() + && qos.parallelCompositeUpload(Files.size(file))) { + ParallelCompositeUploadCallable callable = + new ParallelCompositeUploadCallable(storage, blobInfo, file, config, opts); + SettableApiFuture resultFuture = SettableApiFuture.create(); + pcuQueue.add(new PendingPcuTask(callable, resultFuture)); + uploadTasks.add(resultFuture); + schedulePcuPoller(); + } else { + UploadCallable callable = + new UploadCallable(transferManagerConfig, storage, blobInfo, file, config, opts); + uploadTasks.add(convert(executor.submit(callable))); + } } return UploadJob.newBuilder() .setParallelUploadConfig(config) @@ -103,7 +134,7 @@ public void close() throws Exception { Storage.BlobSourceOption[] opts = config.getOptionsPerRequest().toArray(new Storage.BlobSourceOption[0]); List> downloadTasks = new ArrayList<>(); - if (!transferManagerConfig.isAllowDivideAndConquer()) { + if (!transferManagerConfig.isAllowDivideAndConquerDownload()) { for (BlobInfo blob : blobs) { DirectDownloadCallable callable = new DirectDownloadCallable(storage, blob, config, opts); downloadTasks.add(convert(executor.submit(callable))); @@ -151,6 +182,26 @@ public void close() throws Exception { .build(); } + private void schedulePcuPoller() { + if (pcuPoller == null) { + synchronized (pcuPollerSync) { + if (pcuPoller == null) { + pcuPoller = convert(executor.submit(new PcuPoller())); + } + } + } + } + + private void deschedulePcuPoller() { + if (pcuPoller != null) { + synchronized (pcuPollerSync) { + if (pcuPoller != null) { + pcuPoller = null; + } + } + } + } + private static ApiFuture convert(ListenableFuture lf) { return new ListenableFutureToApiFuture<>(lf); } @@ -191,4 +242,43 @@ public static Range of(long begin, long end) { return new Range(begin, end); } } + + /** + * When performing a Parallel composite upload, the thread pool we perform work on is shared as + * the PCU worker pool. Because of this, if we submit our work to the executor service and take + * all the threads waiting for PCU uploads to complete, the PCU work doesn't have any threads + * available to itself. + * + *

        This class represents a single worker that will be submitted to the executor service and + * will poll a queue to process a single PCU at a time, leaving any other threads free for PCU + * work. + */ + private final class PcuPoller implements Runnable { + + @Override + public void run() { + do { + PendingPcuTask poll = pcuQueue.poll(); + if (poll == null) { + deschedulePcuPoller(); + return; + } + + UploadResult result = poll.callable.call(); + poll.resultFuture.set(result); + + } while (true); + } + } + + private static final class PendingPcuTask { + private final ParallelCompositeUploadCallable callable; + private final SettableApiFuture resultFuture; + + private PendingPcuTask( + ParallelCompositeUploadCallable callable, SettableApiFuture resultFuture) { + this.callable = callable; + this.resultFuture = resultFuture; + } + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java deleted file mode 100644 index 4cb1ee86ae..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BlobTest.java +++ /dev/null @@ -1,600 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.capture; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createNiceMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import com.google.api.core.ApiClock; -import com.google.api.gax.retrying.RetrySettings; -import com.google.cloud.ReadChannel; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.Blob.BlobSourceOption; -import com.google.cloud.storage.BlobInfo.BuilderImpl; -import com.google.cloud.storage.Storage.CopyRequest; -import com.google.cloud.storage.spi.v1.HttpStorageRpc; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.io.BaseEncoding; -import java.io.File; -import java.net.URL; -import java.nio.file.Path; -import java.security.Key; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import javax.crypto.spec.SecretKeySpec; -import org.easymock.Capture; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -public class BlobTest { - - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - private static final List ACLS = ImmutableList.of(ACL, OTHER_ACL); - private static final Integer COMPONENT_COUNT = 2; - private static final String CONTENT_TYPE = "text/html"; - private static final String CACHE_CONTROL = "cache"; - private static final String CONTENT_DISPOSITION = "content-disposition"; - private static final String CONTENT_ENCODING = "UTF-8"; - private static final String CONTENT_LANGUAGE = "En"; - private static final String CRC32 = "FF00"; - private static final String CRC32_HEX_STRING = "145d34"; - private static final Long DELETE_TIME = System.currentTimeMillis(); - private static final String ETAG = "0xFF00"; - private static final Long GENERATION = 1L; - private static final String GENERATED_ID = "B/N:1"; - private static final String MD5 = "FF00"; - private static final String MD5_HEX_STRING = "145d34"; - private static final String MEDIA_LINK = "http://media/b/n"; - private static final Map METADATA = ImmutableMap.of("n1", "v1", "n2", "v2"); - private static final Long META_GENERATION = 10L; - private static final User OWNER = new User("user@gmail.com"); - private static final String SELF_LINK = "http://storage/b/n"; - private static final Long SIZE = 1024L; - private static final Long UPDATE_TIME = DELETE_TIME - 1L; - private static final Long CREATE_TIME = UPDATE_TIME - 1L; - private static final Long CUSTOM_TIME = CREATE_TIME - 1L; - private static final StorageClass STORAGE_CLASS = StorageClass.COLDLINE; - private static final Long TIME_STORAGE_CLASS_UPDATED = CREATE_TIME; - private static final String ENCRYPTION_ALGORITHM = "AES256"; - private static final String KEY_SHA256 = "keySha"; - private static final BlobInfo.CustomerEncryption CUSTOMER_ENCRYPTION = - new BlobInfo.CustomerEncryption(ENCRYPTION_ALGORITHM, KEY_SHA256); - private static final String KMS_KEY_NAME = - "projects/p/locations/kr-loc/keyRings/kr/cryptoKeys/key"; - private static final Boolean EVENT_BASED_HOLD = true; - private static final Boolean TEMPORARY_HOLD = true; - private static final Long RETENTION_EXPIRATION_TIME = 10L; - private static final BlobInfo FULL_BLOB_INFO = - BlobInfo.newBuilder("b", "n", GENERATION) - .setAcl(ACLS) - .setComponentCount(COMPONENT_COUNT) - .setContentType(CONTENT_TYPE) - .setCacheControl(CACHE_CONTROL) - .setContentDisposition(CONTENT_DISPOSITION) - .setContentEncoding(CONTENT_ENCODING) - .setContentLanguage(CONTENT_LANGUAGE) - .setCrc32c(CRC32) - .setDeleteTime(DELETE_TIME) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMd5(MD5) - .setMediaLink(MEDIA_LINK) - .setMetadata(METADATA) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setSize(SIZE) - .setUpdateTime(UPDATE_TIME) - .setCreateTime(CREATE_TIME) - .setCustomTime(CUSTOM_TIME) - .setStorageClass(STORAGE_CLASS) - .setTimeStorageClassUpdated(TIME_STORAGE_CLASS_UPDATED) - .setCustomerEncryption(CUSTOMER_ENCRYPTION) - .setKmsKeyName(KMS_KEY_NAME) - .setEventBasedHold(EVENT_BASED_HOLD) - .setTemporaryHold(TEMPORARY_HOLD) - .setRetentionExpirationTime(RETENTION_EXPIRATION_TIME) - .build(); - private static final BlobInfo BLOB_INFO = - BlobInfo.newBuilder("b", "n", 12345678L).setMetageneration(42L).build(); - private static final BlobInfo BLOB_INFO_NO_GENERATION = - BlobInfo.newBuilder(BLOB_INFO.getBucket(), BLOB_INFO.getName()) - .setMetageneration(42L) - .build(); - private static final BlobInfo DIRECTORY_INFO = - BlobInfo.newBuilder("b", "n/").setSize(0L).setIsDirectory(true).build(); - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - - // This retrying setting is used by test testDownloadWithRetries. This unit test is setup - // to write one byte and then throw retryable exception, it then writes another bytes on - // second call succeeds. - private static final RetrySettings RETRY_SETTINGS = - RetrySettings.newBuilder().setMaxAttempts(2).build(); - private static final ApiClock API_CLOCK = - new ApiClock() { - @Override - public long nanoTime() { - return 42_000_000_000L; - } - - @Override - public long millisTime() { - return 42_000L; - } - }; - - private Storage storage; - private Blob blob; - private Blob expectedBlob; - private Storage serviceMockReturnsOptions = createMock(Storage.class); - private HttpStorageOptions mockOptions = createMock(HttpStorageOptions.class); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() throws Exception { - verify(storage); - } - - private void initializeExpectedBlob() { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).anyTimes(); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - replay(serviceMockReturnsOptions); - expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(BLOB_INFO)); - } - - private void initializeBlob() { - blob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - } - - @Test - public void testExists_True() throws Exception { - initializeExpectedBlob(); - Storage.BlobGetOption[] expectedOptions = {Storage.BlobGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(expectedBlob.getBlobId(), expectedOptions)).andReturn(expectedBlob); - replay(storage); - initializeBlob(); - assertTrue(blob.exists()); - } - - @Test - public void testExists_False() throws Exception { - Storage.BlobGetOption[] expectedOptions = {Storage.BlobGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO.getBlobId(), expectedOptions)).andReturn(null); - replay(storage); - initializeBlob(); - assertFalse(blob.exists()); - } - - @Test - public void testContent() throws Exception { - initializeExpectedBlob(); - byte[] content = {1, 2}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.readAllBytes(BLOB_INFO.getBlobId())).andReturn(content); - replay(storage); - initializeBlob(); - assertArrayEquals(content, blob.getContent()); - } - - @Test - public void testContentWithDecryptionKey() throws Exception { - initializeExpectedBlob(); - byte[] content = {1, 2}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect( - storage.readAllBytes( - BLOB_INFO.getBlobId(), Storage.BlobSourceOption.decryptionKey(BASE64_KEY))) - .andReturn(content) - .times(2); - replay(storage); - initializeBlob(); - assertArrayEquals(content, blob.getContent(BlobSourceOption.decryptionKey(BASE64_KEY))); - assertArrayEquals(content, blob.getContent(BlobSourceOption.decryptionKey(KEY))); - } - - @Test - public void testReload() throws Exception { - initializeExpectedBlob(); - Blob expectedReloadedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), new Storage.BlobGetOption[0])) - .andReturn(expectedReloadedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = blob.reload(); - assertEquals(expectedReloadedBlob, updatedBlob); - } - - @Test - public void testReloadNull() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), new Storage.BlobGetOption[0])) - .andReturn(null); - replay(storage); - initializeBlob(); - Blob reloadedBlob = blob.reload(); - assertNull(reloadedBlob); - } - - @Test - public void testReloadWithOptions() throws Exception { - initializeExpectedBlob(); - Blob expectedReloadedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - Storage.BlobGetOption[] options = {Storage.BlobGetOption.metagenerationMatch(42L)}; - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.get(BLOB_INFO_NO_GENERATION.getBlobId(), options)) - .andReturn(expectedReloadedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = blob.reload(BlobSourceOption.metagenerationMatch()); - assertEquals(expectedReloadedBlob, updatedBlob); - } - - @Test - public void testUpdate() throws Exception { - initializeExpectedBlob(); - Blob expectedUpdatedBlob = expectedBlob.toBuilder().setCacheControl("c").build(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.update(eq(expectedUpdatedBlob), new Storage.BlobTargetOption[0])) - .andReturn(expectedUpdatedBlob); - replay(storage); - initializeBlob(); - Blob updatedBlob = new Blob(storage, new BlobInfo.BuilderImpl(expectedUpdatedBlob)); - Blob actualUpdatedBlob = updatedBlob.update(); - assertEquals(expectedUpdatedBlob, actualUpdatedBlob); - } - - @Test - public void testDelete() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.delete(BLOB_INFO.getBlobId(), new Storage.BlobSourceOption[0])).andReturn(true); - replay(storage); - initializeBlob(); - assertTrue(blob.delete()); - } - - @Test - public void testCopyToBucket() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "n")).build(); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo("bt"); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testCopyTo() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "nt")).build(); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo("bt", "nt"); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testCopyToBlobId() throws Exception { - initializeExpectedBlob(); - BlobInfo target = BlobInfo.newBuilder(BlobId.of("bt", "nt")).build(); - BlobId targetId = BlobId.of("bt", "nt"); - CopyWriter copyWriter = createMock(CopyWriter.class); - Capture capturedCopyRequest = Capture.newInstance(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.copy(capture(capturedCopyRequest))).andReturn(copyWriter); - replay(storage); - initializeBlob(); - CopyWriter returnedCopyWriter = blob.copyTo(targetId); - assertEquals(copyWriter, returnedCopyWriter); - assertEquals(BLOB_INFO_NO_GENERATION.getBlobId(), capturedCopyRequest.getValue().getSource()); - assertEquals(target, capturedCopyRequest.getValue().getTarget()); - assertFalse(capturedCopyRequest.getValue().overrideInfo()); - assertTrue(capturedCopyRequest.getValue().getSourceOptions().isEmpty()); - assertTrue(capturedCopyRequest.getValue().getTargetOptions().isEmpty()); - } - - @Test - public void testReader() throws Exception { - initializeExpectedBlob(); - ReadChannel channel = createMock(ReadChannel.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.reader(BLOB_INFO.getBlobId())).andReturn(channel); - replay(storage); - initializeBlob(); - assertSame(channel, blob.reader()); - } - - @Test - public void testReaderWithDecryptionKey() throws Exception { - initializeExpectedBlob(); - ReadChannel channel = createMock(ReadChannel.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect( - storage.reader( - BLOB_INFO.getBlobId(), Storage.BlobSourceOption.decryptionKey(BASE64_KEY))) - .andReturn(channel) - .times(2); - replay(storage); - initializeBlob(); - assertSame(channel, blob.reader(BlobSourceOption.decryptionKey(BASE64_KEY))); - assertSame(channel, blob.reader(BlobSourceOption.decryptionKey(KEY))); - } - - @Test - public void testSignUrl() throws Exception { - initializeExpectedBlob(); - URL url = new URL("http://localhost:123/bla"); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.signUrl(expectedBlob, 100, TimeUnit.SECONDS)).andReturn(url); - replay(storage); - initializeBlob(); - assertEquals(url, blob.signUrl(100, TimeUnit.SECONDS)); - } - - @Test - public void testGetAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.getAcl(BLOB_INFO.getBlobId(), User.ofAllAuthenticatedUsers())).andReturn(ACL); - replay(storage); - initializeBlob(); - assertEquals(ACL, blob.getAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.deleteAcl(BLOB_INFO.getBlobId(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBlob(); - assertTrue(blob.deleteAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createAcl(BLOB_INFO.getBlobId(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBlob(); - assertEquals(returnedAcl, blob.createAcl(ACL)); - } - - @Test - public void testUpdateAcl() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateAcl(BLOB_INFO.getBlobId(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBlob(); - assertEquals(returnedAcl, blob.updateAcl(ACL)); - } - - @Test - public void testListAcls() throws Exception { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(storage.listAcls(BLOB_INFO.getBlobId())).andReturn(ACLS); - replay(storage); - initializeBlob(); - assertEquals(ACLS, blob.listAcls()); - } - - @Test - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(storage); - replay(mockOptions); - Blob fullBlob = new Blob(storage, new BlobInfo.BuilderImpl(FULL_BLOB_INFO)); - assertEquals(fullBlob, fullBlob.toBuilder().build()); - Blob simpleBlob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - assertEquals(simpleBlob, simpleBlob.toBuilder().build()); - Blob directory = new Blob(storage, new BlobInfo.BuilderImpl(DIRECTORY_INFO)); - assertEquals(directory, directory.toBuilder().build()); - } - - @Test - public void testBuilder() { - initializeExpectedBlob(); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - replay(storage); - Blob.Builder builder = new Blob.Builder(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO))); - Blob blob = - builder - .setAcl(ACLS) - .setComponentCount(COMPONENT_COUNT) - .setContentType(CONTENT_TYPE) - .setCacheControl(CACHE_CONTROL) - .setContentDisposition(CONTENT_DISPOSITION) - .setContentEncoding(CONTENT_ENCODING) - .setContentLanguage(CONTENT_LANGUAGE) - .setCrc32c(CRC32) - .setCreateTime(CREATE_TIME) - .setCustomTime(CUSTOM_TIME) - .setStorageClass(STORAGE_CLASS) - .setTimeStorageClassUpdated(TIME_STORAGE_CLASS_UPDATED) - .setCustomerEncryption(CUSTOMER_ENCRYPTION) - .setKmsKeyName(KMS_KEY_NAME) - .setEventBasedHold(EVENT_BASED_HOLD) - .setTemporaryHold(TEMPORARY_HOLD) - .setRetentionExpirationTime(RETENTION_EXPIRATION_TIME) - .setDeleteTime(DELETE_TIME) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMd5(MD5) - .setMediaLink(MEDIA_LINK) - .setMetadata(METADATA) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setSize(SIZE) - .setUpdateTime(UPDATE_TIME) - .build(); - assertEquals("b", blob.getBucket()); - assertEquals("n", blob.getName()); - assertEquals(ACLS, blob.getAcl()); - assertEquals(COMPONENT_COUNT, blob.getComponentCount()); - assertEquals(CONTENT_TYPE, blob.getContentType()); - assertEquals(CACHE_CONTROL, blob.getCacheControl()); - assertEquals(CONTENT_DISPOSITION, blob.getContentDisposition()); - assertEquals(CONTENT_ENCODING, blob.getContentEncoding()); - assertEquals(CONTENT_LANGUAGE, blob.getContentLanguage()); - assertEquals(CRC32, blob.getCrc32c()); - assertEquals(CRC32_HEX_STRING, blob.getCrc32cToHexString()); - assertEquals(CREATE_TIME, blob.getCreateTime()); - assertEquals(CUSTOM_TIME, blob.getCustomTime()); - assertEquals(STORAGE_CLASS, blob.getStorageClass()); - assertEquals(TIME_STORAGE_CLASS_UPDATED, blob.getTimeStorageClassUpdated()); - assertEquals(CUSTOMER_ENCRYPTION, blob.getCustomerEncryption()); - assertEquals(KMS_KEY_NAME, blob.getKmsKeyName()); - assertEquals(EVENT_BASED_HOLD, blob.getEventBasedHold()); - assertEquals(TEMPORARY_HOLD, blob.getTemporaryHold()); - assertEquals(RETENTION_EXPIRATION_TIME, blob.getRetentionExpirationTime()); - assertEquals(DELETE_TIME, blob.getDeleteTime()); - assertEquals(ETAG, blob.getEtag()); - assertEquals(GENERATED_ID, blob.getGeneratedId()); - assertEquals(MD5, blob.getMd5()); - assertEquals(MD5_HEX_STRING, blob.getMd5ToHexString()); - assertEquals(MEDIA_LINK, blob.getMediaLink()); - assertEquals(METADATA, blob.getMetadata()); - assertEquals(META_GENERATION, blob.getMetageneration()); - assertEquals(OWNER, blob.getOwner()); - assertEquals(SELF_LINK, blob.getSelfLink()); - assertEquals(SIZE, blob.getSize()); - assertEquals(UPDATE_TIME, blob.getUpdateTime()); - assertEquals(storage.getOptions(), blob.getStorage().getOptions()); - assertFalse(blob.isDirectory()); - builder = new Blob.Builder(new Blob(storage, new BlobInfo.BuilderImpl(DIRECTORY_INFO))); - blob = builder.setBlobId(BlobId.of("b", "n/")).setIsDirectory(true).setSize(0L).build(); - assertEquals("b", blob.getBucket()); - assertEquals("n/", blob.getName()); - assertNull(blob.getAcl()); - assertNull(blob.getComponentCount()); - assertNull(blob.getContentType()); - assertNull(blob.getCacheControl()); - assertNull(blob.getContentDisposition()); - assertNull(blob.getContentEncoding()); - assertNull(blob.getContentLanguage()); - assertNull(blob.getCrc32c()); - assertNull(blob.getCrc32cToHexString()); - assertNull(blob.getCreateTime()); - assertNull(blob.getStorageClass()); - assertNull(blob.getTimeStorageClassUpdated()); - assertNull(blob.getCustomerEncryption()); - assertNull(blob.getKmsKeyName()); - assertNull(blob.getEventBasedHold()); - assertNull(blob.getTemporaryHold()); - assertNull(blob.getRetentionExpirationTime()); - assertNull(blob.getDeleteTime()); - assertNull(blob.getEtag()); - assertNull(blob.getGeneratedId()); - assertNull(blob.getMd5()); - assertNull(blob.getMd5ToHexString()); - assertNull(blob.getMediaLink()); - assertNull(blob.getMetadata()); - assertNull(blob.getMetageneration()); - assertNull(blob.getOwner()); - assertNull(blob.getSelfLink()); - assertEquals(0L, (long) blob.getSize()); - assertNull(blob.getUpdateTime()); - assertNull(blob.getCustomTime()); - assertTrue(blob.isDirectory()); - } - - private StorageRpc prepareForDownload() { - HttpStorageRpc mockStorageRpc = createNiceMock(HttpStorageRpc.class); - expect(storage.getOptions()).andReturn(mockOptions).anyTimes(); - replay(storage); - expect(mockOptions.getStorageRpcV1()).andReturn(mockStorageRpc); - expect(mockOptions.getRetrySettings()).andReturn(RETRY_SETTINGS); - expect(mockOptions.getClock()).andReturn(API_CLOCK); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - blob = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO)); - return mockStorageRpc; - } - - @Test - public void testDownloadTo() throws Exception { - replay(storage); - File file = File.createTempFile("blob", ".tmp"); - Path path = file.toPath(); - - Storage s = Mockito.mock(Storage.class); - Blob blob = new Blob(s, new BuilderImpl(BlobInfo.newBuilder("buck", "obj").build())); - - Mockito.doNothing().when(s).downloadTo(blob.getBlobId(), path); - blob.downloadTo(path); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java deleted file mode 100644 index 4bdb3d7f4c..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BucketTest.java +++ /dev/null @@ -1,837 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static com.google.cloud.storage.Acl.Role.WRITER; -import static com.google.common.truth.Truth.assertThat; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.gax.paging.Page; -import com.google.cloud.PageImpl; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.BucketInfo.AgeDeleteRule; -import com.google.cloud.storage.BucketInfo.DeleteRule; -import com.google.cloud.storage.BucketInfo.LifecycleRule; -import com.google.cloud.storage.BucketInfo.LifecycleRule.LifecycleAction; -import com.google.cloud.storage.BucketInfo.LifecycleRule.LifecycleCondition; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Lists; -import com.google.common.hash.Hashing; -import com.google.common.io.BaseEncoding; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.security.Key; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import javax.crypto.spec.SecretKeySpec; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class BucketTest { - - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - private static final List ACLS = ImmutableList.of(ACL, OTHER_ACL); - private static final String ETAG = "0xFF00"; - private static final String GENERATED_ID = "B/N:1"; - private static final Long META_GENERATION = 10L; - private static final User OWNER = new User("user@gmail.com"); - private static final String SELF_LINK = "http://storage/b/n"; - private static final Long CREATE_TIME = System.currentTimeMillis(); - private static final Long UPDATE_TIME = CREATE_TIME - 1L; - private static final List CORS = Collections.singletonList(Cors.newBuilder().build()); - private static final List DEFAULT_ACL = - Collections.singletonList(Acl.of(User.ofAllAuthenticatedUsers(), WRITER)); - - @SuppressWarnings({"unchecked", "deprecation"}) - private static final List DELETE_RULES = - Collections.singletonList(new AgeDeleteRule(5)); - - private static final List LIFECYCLE_RULES = - Collections.singletonList( - new LifecycleRule( - LifecycleAction.newDeleteAction(), - LifecycleCondition.newBuilder().setAge(5).build())); - private static final String INDEX_PAGE = "index.html"; - private static final String NOT_FOUND_PAGE = "error.html"; - private static final String LOCATION = "ASIA"; - private static final StorageClass STORAGE_CLASS = StorageClass.STANDARD; - private static final String DEFAULT_KMS_KEY_NAME = - "projects/p/locations/kr-loc/keyRings/kr/cryptoKeys/key"; - private static final Boolean VERSIONING_ENABLED = true; - private static final Map BUCKET_LABELS = ImmutableMap.of("label1", "value1"); - private static final Boolean REQUESTER_PAYS = true; - private static final String USER_PROJECT = "test-project"; - private static final Boolean DEFAULT_EVENT_BASED_HOLD = true; - private static final Long RETENTION_EFFECTIVE_TIME = 10L; - private static final Long RETENTION_PERIOD = 10L; - private static final Boolean RETENTION_POLICY_IS_LOCKED = false; - private static final List LOCATION_TYPES = - ImmutableList.of("multi-region", "region", "dual-region"); - private static final String LOCATION_TYPE = "multi-region"; - - @SuppressWarnings({"unchecked", "deprecation"}) - private static final BucketInfo FULL_BUCKET_INFO = - BucketInfo.newBuilder("b") - .setAcl(ACLS) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setCors(CORS) - .setCreateTime(CREATE_TIME) - .setUpdateTime(UPDATE_TIME) - .setDefaultAcl(DEFAULT_ACL) - .setDeleteRules(DELETE_RULES) - .setLifecycleRules(LIFECYCLE_RULES) - .setIndexPage(INDEX_PAGE) - .setNotFoundPage(NOT_FOUND_PAGE) - .setLocation(LOCATION) - .setStorageClass(STORAGE_CLASS) - .setVersioningEnabled(VERSIONING_ENABLED) - .setLabels(BUCKET_LABELS) - .setRequesterPays(REQUESTER_PAYS) - .setDefaultKmsKeyName(DEFAULT_KMS_KEY_NAME) - .setDefaultEventBasedHold(DEFAULT_EVENT_BASED_HOLD) - .setRetentionEffectiveTime(RETENTION_EFFECTIVE_TIME) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED) - .build(); - - private static final BucketInfo BUCKET_INFO = - BucketInfo.newBuilder("b").setMetageneration(42L).build(); - private static final String CONTENT_TYPE = "text/plain"; - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - private Storage storage; - private Storage serviceMockReturnsOptions = createMock(Storage.class); - private HttpStorageOptions mockOptions = createMock(HttpStorageOptions.class); - private Bucket bucket; - private Bucket expectedBucket; - private List blobResults; - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() throws Exception { - verify(storage); - } - - private void initializeExpectedBucket() { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).anyTimes(); - replay(serviceMockReturnsOptions); - expect(mockOptions.getRetryAlgorithmManager()).andReturn(retryAlgorithmManager).anyTimes(); - replay(mockOptions); - expectedBucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(BUCKET_INFO)); - blobResults = - ImmutableList.of( - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n1").build())), - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n2").build())), - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n3").build()))); - } - - private void initializeBucket() { - bucket = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO)); - } - - @Test - public void testExists_True() throws Exception { - initializeExpectedBucket(); - Storage.BucketGetOption[] expectedOptions = {Storage.BucketGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName(), expectedOptions)).andReturn(expectedBucket); - replay(storage); - initializeBucket(); - assertTrue(bucket.exists()); - } - - @Test - public void testExists_False() throws Exception { - initializeExpectedBucket(); - Storage.BucketGetOption[] expectedOptions = {Storage.BucketGetOption.fields()}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName(), expectedOptions)).andReturn(null); - replay(storage); - initializeBucket(); - assertFalse(bucket.exists()); - } - - @Test - public void testReload() throws Exception { - initializeExpectedBucket(); - BucketInfo updatedInfo = BUCKET_INFO.toBuilder().setNotFoundPage("p").build(); - Bucket expectedUpdatedBucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(updatedInfo)); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(updatedInfo.getName())).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = bucket.reload(); - assertEquals(expectedUpdatedBucket, updatedBucket); - } - - @Test - public void testReloadNull() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BUCKET_INFO.getName())).andReturn(null); - replay(storage); - initializeBucket(); - assertNull(bucket.reload()); - } - - @Test - public void testReloadWithOptions() throws Exception { - initializeExpectedBucket(); - BucketInfo updatedInfo = BUCKET_INFO.toBuilder().setNotFoundPage("p").build(); - Bucket expectedUpdatedBucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(updatedInfo)); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(updatedInfo.getName(), Storage.BucketGetOption.metagenerationMatch(42L))) - .andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = bucket.reload(Bucket.BucketSourceOption.metagenerationMatch()); - assertEquals(expectedUpdatedBucket, updatedBucket); - } - - @Test - public void testUpdate() throws Exception { - initializeExpectedBucket(); - Bucket expectedUpdatedBucket = expectedBucket.toBuilder().setNotFoundPage("p").build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertEquals(expectedUpdatedBucket, actualUpdatedBucket); - } - - @Test - public void testDelete() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.delete(BUCKET_INFO.getName())).andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.delete()); - } - - @Test - public void testList() throws Exception { - initializeExpectedBucket(); - PageImpl expectedBlobPage = new PageImpl<>(null, "c", blobResults); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.list(BUCKET_INFO.getName())).andReturn(expectedBlobPage); - replay(storage); - initializeBucket(); - Page blobPage = bucket.list(); - Iterator blobInfoIterator = blobPage.getValues().iterator(); - Iterator blobIterator = blobPage.getValues().iterator(); - while (blobInfoIterator.hasNext() && blobIterator.hasNext()) { - assertEquals(blobInfoIterator.next(), blobIterator.next()); - } - assertFalse(blobInfoIterator.hasNext()); - assertFalse(blobIterator.hasNext()); - assertEquals(expectedBlobPage.getNextPageToken(), blobPage.getNextPageToken()); - } - - @Test - public void testGet() throws Exception { - initializeExpectedBucket(); - Blob expectedBlob = - new Blob( - serviceMockReturnsOptions, - new BlobInfo.BuilderImpl(BlobInfo.newBuilder("b", "n").build())); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.get(BlobId.of(expectedBucket.getName(), "n"), new Storage.BlobGetOption[0])) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.get("n"); - assertEquals(expectedBlob, blob); - } - - @Test - public void testGetAllArray() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - List blobIds = - Lists.transform( - blobResults, - new Function() { - @Override - public BlobId apply(Blob blob) { - return blob.getBlobId(); - } - }); - expect(storage.get(blobIds)).andReturn(blobResults); - replay(storage); - initializeBucket(); - assertEquals(blobResults, bucket.get("n1", "n2", "n3")); - } - - @Test - public void testGetAllIterable() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - List blobIds = - Lists.transform( - blobResults, - new Function() { - @Override - public BlobId apply(Blob blob) { - return blob.getBlobId(); - } - }); - expect(storage.get(blobIds)).andReturn(blobResults); - replay(storage); - initializeBucket(); - assertEquals(blobResults, bucket.get(ImmutableList.of("n1", "n2", "n3"))); - } - - @Test - public void testCreate() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content, CONTENT_TYPE); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateNoContentType() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithOptions() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - Storage.PredefinedAcl acl = Storage.PredefinedAcl.ALL_AUTHENTICATED_USERS; - expect(storage.getOptions()).andReturn(mockOptions); - expect( - storage.create( - info, - content, - new BlobTargetOption(UnifiedOpts.generationMatch(42L)), - new BlobTargetOption(UnifiedOpts.metagenerationMatch(24L)), - Storage.BlobTargetOption.predefinedAcl(acl), - Storage.BlobTargetOption.encryptionKey(BASE64_KEY), - Storage.BlobTargetOption.userProject(USER_PROJECT))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", - content, - CONTENT_TYPE, - Bucket.BlobTargetOption.generationMatch(42L), - Bucket.BlobTargetOption.metagenerationMatch(24L), - Bucket.BlobTargetOption.predefinedAcl(acl), - Bucket.BlobTargetOption.encryptionKey(BASE64_KEY), - Bucket.BlobTargetOption.userProject(USER_PROJECT)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithEncryptionKey() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, Storage.BlobTargetOption.encryptionKey(KEY))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", content, CONTENT_TYPE, Bucket.BlobTargetOption.encryptionKey(KEY)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateWithKmsKeyName() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, Storage.BlobTargetOption.kmsKeyName(DEFAULT_KMS_KEY_NAME))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", content, CONTENT_TYPE, Bucket.BlobTargetOption.kmsKeyName(DEFAULT_KMS_KEY_NAME)); - assertEquals(expectedBlob, blob); - } - - @Test - public void testCreateNotExists() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, content, new BlobTargetOption(UnifiedOpts.doesNotExist()))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", content, CONTENT_TYPE, Bucket.BlobTargetOption.doesNotExist()); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStream() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", streamContent, CONTENT_TYPE); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamNoContentType() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder("b", "n").build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent)).andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = bucket.create("n", streamContent); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamWithOptions() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = info.asBlob(serviceMockReturnsOptions); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - String crc32c = Utils.crc32cCodec.encode(Hashing.crc32c().hashBytes(content).asInt()); - Storage.PredefinedAcl acl = Storage.PredefinedAcl.ALL_AUTHENTICATED_USERS; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect( - storage.create( - info, - streamContent, - new BlobWriteOption(UnifiedOpts.generationMatch(42L)), - new BlobWriteOption(UnifiedOpts.metagenerationMatch(24L)), - Storage.BlobWriteOption.predefinedAcl(acl), - new BlobWriteOption(UnifiedOpts.crc32cMatch(crc32c)), - new BlobWriteOption(UnifiedOpts.md5Match("md5")), - Storage.BlobWriteOption.encryptionKey(BASE64_KEY), - Storage.BlobWriteOption.userProject(USER_PROJECT))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create( - "n", - streamContent, - CONTENT_TYPE, - Bucket.BlobWriteOption.generationMatch(42L), - Bucket.BlobWriteOption.metagenerationMatch(24L), - Bucket.BlobWriteOption.predefinedAcl(acl), - Bucket.BlobWriteOption.crc32cMatch(crc32c), - Bucket.BlobWriteOption.md5Match("md5"), - Bucket.BlobWriteOption.encryptionKey(BASE64_KEY), - Bucket.BlobWriteOption.userProject(USER_PROJECT)); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamWithEncryptionKey() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = new Blob(serviceMockReturnsOptions, new BlobInfo.BuilderImpl(info)); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent, Storage.BlobWriteOption.encryptionKey(KEY))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", streamContent, CONTENT_TYPE, Bucket.BlobWriteOption.encryptionKey(KEY)); - assertEquals(expectedBlob, blob); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testCreateFromStreamNotExists() throws Exception { - initializeExpectedBucket(); - BlobInfo info = BlobInfo.newBuilder(BlobId.of("b", "n")).setContentType(CONTENT_TYPE).build(); - Blob expectedBlob = info.asBlob(serviceMockReturnsOptions); - byte[] content = {0xD, 0xE, 0xA, 0xD}; - InputStream streamContent = new ByteArrayInputStream(content); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.create(info, streamContent, new BlobWriteOption(UnifiedOpts.doesNotExist()))) - .andReturn(expectedBlob); - replay(storage); - initializeBucket(); - Blob blob = - bucket.create("n", streamContent, CONTENT_TYPE, Bucket.BlobWriteOption.doesNotExist()); - assertEquals(expectedBlob, blob); - } - - @Test - public void testGetAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.getAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())).andReturn(ACL); - replay(storage); - initializeBucket(); - assertEquals(ACL, bucket.getAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.deleteAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.deleteAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.createAcl(ACL)); - } - - @Test - public void testUpdateAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.updateAcl(ACL)); - } - - @Test - public void testListAcls() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.listAcls(BUCKET_INFO.getName())).andReturn(ACLS); - replay(storage); - initializeBucket(); - assertEquals(ACLS, bucket.listAcls()); - } - - @Test - public void testGetDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.getDefaultAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(ACL); - replay(storage); - initializeBucket(); - assertEquals(ACL, bucket.getDefaultAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.deleteDefaultAcl(BUCKET_INFO.getName(), User.ofAllAuthenticatedUsers())) - .andReturn(true); - replay(storage); - initializeBucket(); - assertTrue(bucket.deleteDefaultAcl(User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.createDefaultAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.createDefaultAcl(ACL)); - } - - @Test - public void testUpdateDefaultAcl() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - expect(storage.updateDefaultAcl(BUCKET_INFO.getName(), ACL)).andReturn(returnedAcl); - replay(storage); - initializeBucket(); - assertEquals(returnedAcl, bucket.updateDefaultAcl(ACL)); - } - - @Test - public void testListDefaultAcls() throws Exception { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions); - expect(storage.listDefaultAcls(BUCKET_INFO.getName())).andReturn(ACLS); - replay(storage); - initializeBucket(); - assertEquals(ACLS, bucket.listDefaultAcls()); - } - - @Test - public void testLockRetention() throws Exception { - initializeExpectedBucket(); - Bucket expectedRetentionLockedBucket = - expectedBucket - .toBuilder() - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(true) - .build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect( - storage.lockRetentionPolicy( - expectedRetentionLockedBucket, - Storage.BucketTargetOption.metagenerationMatch(), - Storage.BucketTargetOption.userProject(USER_PROJECT))) - .andReturn(expectedRetentionLockedBucket); - replay(storage); - initializeBucket(); - Bucket lockedRetentionPolicyBucket = - new Bucket(storage, new BucketInfo.BuilderImpl(expectedRetentionLockedBucket)); - Bucket actualRetentionLockedBucket = - lockedRetentionPolicyBucket.lockRetentionPolicy( - Storage.BucketTargetOption.metagenerationMatch(), - Storage.BucketTargetOption.userProject(USER_PROJECT)); - assertEquals(expectedRetentionLockedBucket, actualRetentionLockedBucket); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(4); - replay(storage); - Bucket fullBucket = new Bucket(storage, new BucketInfo.BuilderImpl(FULL_BUCKET_INFO)); - assertEquals(fullBucket, fullBucket.toBuilder().build()); - Bucket simpleBlob = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO)); - assertEquals(simpleBlob, simpleBlob.toBuilder().build()); - } - - @Test - @SuppressWarnings({"unchecked", "deprecation"}) - public void testBuilder() { - initializeExpectedBucket(); - expect(storage.getOptions()).andReturn(mockOptions).times(4); - replay(storage); - Bucket.Builder builder = - new Bucket.Builder(new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO))); - Bucket bucket = - builder - .setAcl(ACLS) - .setEtag(ETAG) - .setGeneratedId(GENERATED_ID) - .setMetageneration(META_GENERATION) - .setOwner(OWNER) - .setSelfLink(SELF_LINK) - .setCors(CORS) - .setCreateTime(CREATE_TIME) - .setUpdateTime(UPDATE_TIME) - .setDefaultAcl(DEFAULT_ACL) - .setDeleteRules(DELETE_RULES) - .setLifecycleRules(LIFECYCLE_RULES) - .setIndexPage(INDEX_PAGE) - .setNotFoundPage(NOT_FOUND_PAGE) - .setLocation(LOCATION) - .setLocationType(LOCATION_TYPE) - .setStorageClass(STORAGE_CLASS) - .setVersioningEnabled(VERSIONING_ENABLED) - .setLabels(BUCKET_LABELS) - .setRequesterPays(REQUESTER_PAYS) - .setDefaultKmsKeyName(DEFAULT_KMS_KEY_NAME) - .setDefaultEventBasedHold(DEFAULT_EVENT_BASED_HOLD) - .setRetentionEffectiveTime(RETENTION_EFFECTIVE_TIME) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(RETENTION_POLICY_IS_LOCKED) - .build(); - assertEquals("b", bucket.getName()); - assertEquals(ACLS, bucket.getAcl()); - assertEquals(ETAG, bucket.getEtag()); - assertEquals(GENERATED_ID, bucket.getGeneratedId()); - assertEquals(META_GENERATION, bucket.getMetageneration()); - assertEquals(OWNER, bucket.getOwner()); - assertEquals(SELF_LINK, bucket.getSelfLink()); - assertEquals(CREATE_TIME, bucket.getCreateTime()); - assertEquals(UPDATE_TIME, bucket.getUpdateTime()); - assertEquals(CORS, bucket.getCors()); - assertEquals(DEFAULT_ACL, bucket.getDefaultAcl()); - assertEquals(DELETE_RULES, bucket.getDeleteRules()); - assertEquals(LIFECYCLE_RULES, bucket.getLifecycleRules()); - assertEquals(INDEX_PAGE, bucket.getIndexPage()); - assertEquals(NOT_FOUND_PAGE, bucket.getNotFoundPage()); - assertEquals(LOCATION, bucket.getLocation()); - assertEquals(STORAGE_CLASS, bucket.getStorageClass()); - assertEquals(VERSIONING_ENABLED, bucket.versioningEnabled()); - assertEquals(BUCKET_LABELS, bucket.getLabels()); - assertEquals(REQUESTER_PAYS, bucket.requesterPays()); - assertEquals(DEFAULT_KMS_KEY_NAME, bucket.getDefaultKmsKeyName()); - assertEquals(DEFAULT_EVENT_BASED_HOLD, bucket.getDefaultEventBasedHold()); - assertEquals(RETENTION_EFFECTIVE_TIME, bucket.getRetentionEffectiveTime()); - assertEquals(RETENTION_PERIOD, bucket.getRetentionPeriod()); - assertEquals(RETENTION_POLICY_IS_LOCKED, bucket.retentionPolicyIsLocked()); - assertEquals(storage.getOptions(), bucket.getStorage().getOptions()); - assertTrue(LOCATION_TYPES.contains(LOCATION_TYPE)); - } - - @Test - public void testDeleteLifecycleRules() { - initializeExpectedBucket(); - Bucket bucket = - new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(FULL_BUCKET_INFO)); - assertThat(bucket.getLifecycleRules()).hasSize(1); - Bucket expectedUpdatedBucket = bucket.toBuilder().deleteLifecycleRules().build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getLifecycleRules()).hasSize(0); - } - - @Test - public void testUpdateBucketLogging() { - initializeExpectedBucket(); - BucketInfo.Logging logging = - BucketInfo.Logging.newBuilder() - .setLogBucket("logs-bucket") - .setLogObjectPrefix("test-logs") - .build(); - BucketInfo bucketInfo = BucketInfo.newBuilder("b").setLogging(logging).build(); - Bucket bucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(bucketInfo)); - assertThat(bucket.getLogging().getLogBucket()).isEqualTo("logs-bucket"); - assertThat(bucket.getLogging().getLogObjectPrefix()).isEqualTo("test-logs"); - Bucket expectedUpdatedBucket = bucket.toBuilder().setLogging(null).build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getLogging().getLogBucket()).isNull(); - assertThat(actualUpdatedBucket.getLogging().getLogObjectPrefix()).isNull(); - } - - @Test - public void testRemoveBucketCORS() { - initializeExpectedBucket(); - List origins = ImmutableList.of(Cors.Origin.of("http://cloud.google.com")); - List httpMethods = ImmutableList.of(HttpMethod.GET); - List responseHeaders = ImmutableList.of("Content-Type"); - Cors cors = - Cors.newBuilder() - .setOrigins(origins) - .setMethods(httpMethods) - .setResponseHeaders(responseHeaders) - .setMaxAgeSeconds(100) - .build(); - BucketInfo bucketInfo = BucketInfo.newBuilder("b").setCors(ImmutableList.of(cors)).build(); - Bucket bucket = new Bucket(serviceMockReturnsOptions, new BucketInfo.BuilderImpl(bucketInfo)); - assertThat(bucket.getCors()).isNotNull(); - assertThat(bucket.getCors().get(0).getMaxAgeSeconds()).isEqualTo(100); - assertThat(bucket.getCors().get(0).getMethods()).isEqualTo(httpMethods); - assertThat(bucket.getCors().get(0).getOrigins()).isEqualTo(origins); - assertThat(bucket.getCors().get(0).getResponseHeaders()).isEqualTo(responseHeaders); - - // Remove bucket CORS configuration. - Bucket expectedUpdatedBucket = bucket.toBuilder().setCors(null).build(); - expect(storage.getOptions()).andReturn(mockOptions).times(2); - expect(storage.update(expectedUpdatedBucket)).andReturn(expectedUpdatedBucket); - replay(storage); - initializeBucket(); - Bucket updatedBucket = new Bucket(storage, new BucketInfo.BuilderImpl(expectedUpdatedBucket)); - Bucket actualUpdatedBucket = updatedBucket.update(); - assertThat(actualUpdatedBucket.getCors()).isEmpty(); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java deleted file mode 100644 index 72ff6691f6..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/CopyWriterTest.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import com.google.cloud.RestorableState; -import com.google.cloud.ServiceOptions; -import com.google.cloud.storage.spi.StorageRpcFactory; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.cloud.storage.spi.v1.StorageRpc.RewriteRequest; -import com.google.cloud.storage.spi.v1.StorageRpc.RewriteResponse; -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import org.easymock.EasyMock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class CopyWriterTest { - - private static final String SOURCE_BUCKET_NAME = "b"; - private static final String SOURCE_BLOB_NAME = "n"; - private static final String DESTINATION_BUCKET_NAME = "b1"; - private static final String DESTINATION_BLOB_NAME = "n1"; - private static final BlobId BLOB_ID = BlobId.of(SOURCE_BUCKET_NAME, SOURCE_BLOB_NAME); - private static final BlobInfo BLOB_INFO = - BlobInfo.newBuilder(DESTINATION_BUCKET_NAME, DESTINATION_BLOB_NAME).build(); - private static final BlobInfo RESULT_INFO = - BlobInfo.newBuilder(DESTINATION_BUCKET_NAME, DESTINATION_BLOB_NAME) - .setContentType("type") - .build(); - private static final Map EMPTY_OPTIONS = ImmutableMap.of(); - private static final RewriteRequest REQUEST_WITH_OBJECT = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(BLOB_ID), - EMPTY_OPTIONS, - true, - Conversions.json().blobInfo().encode(BLOB_INFO), - EMPTY_OPTIONS, - null); - private static final RewriteRequest REQUEST_WITHOUT_OBJECT = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(BLOB_ID), - EMPTY_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO), - EMPTY_OPTIONS, - null); - private static final RewriteResponse RESPONSE_WITH_OBJECT = - new RewriteResponse(REQUEST_WITH_OBJECT, null, 42L, false, "token", 21L); - private static final RewriteResponse RESPONSE_WITHOUT_OBJECT = - new RewriteResponse(REQUEST_WITHOUT_OBJECT, null, 42L, false, "token", 21L); - private static final RewriteResponse RESPONSE_WITH_OBJECT_DONE = - new RewriteResponse( - REQUEST_WITH_OBJECT, - Conversions.json().blobInfo().encode(RESULT_INFO), - 42L, - true, - "token", - 42L); - private static final RewriteResponse RESPONSE_WITHOUT_OBJECT_DONE = - new RewriteResponse( - REQUEST_WITHOUT_OBJECT, - Conversions.json().blobInfo().encode(RESULT_INFO), - 42L, - true, - "token", - 42L); - - private HttpStorageOptions options; - private StorageRpcFactory rpcFactoryMock; - private StorageRpc storageRpcMock; - private CopyWriter copyWriter; - private Blob result; - - @Before - public void setUp() { - rpcFactoryMock = createMock(StorageRpcFactory.class); - storageRpcMock = createMock(StorageRpc.class); - expect(rpcFactoryMock.create(anyObject(StorageOptions.class))).andReturn(storageRpcMock); - replay(rpcFactoryMock); - options = - HttpStorageOptions.newBuilder() - .setProjectId("projectid") - .setServiceRpcFactory(rpcFactoryMock) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - result = new Blob(options.getService(), new BlobInfo.BuilderImpl(RESULT_INFO)); - } - - @After - public void tearDown() throws Exception { - verify(rpcFactoryMock, storageRpcMock); - } - - @Test - public void testRewriteWithObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithoutObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithObjectMultipleRequests() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testRewriteWithoutObjectMultipleRequests() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - copyWriter.copyChunk(); - assertTrue(!copyWriter.isDone()); - assertEquals(21L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithoutObject() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT); - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITHOUT_OBJECT)) - .andReturn(RESPONSE_WITHOUT_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITHOUT_OBJECT); - copyWriter.copyChunk(); - assertTrue(!copyWriter.isDone()); - assertEquals(21L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } - - @Test - public void testSaveAndRestoreWithResult() { - EasyMock.expect(storageRpcMock.continueRewrite(RESPONSE_WITH_OBJECT)) - .andReturn(RESPONSE_WITH_OBJECT_DONE); - EasyMock.replay(storageRpcMock); - copyWriter = new HttpCopyWriter(options, RESPONSE_WITH_OBJECT); - copyWriter.copyChunk(); - assertEquals(result, copyWriter.getResult()); - assertTrue(copyWriter.isDone()); - assertEquals(42L, copyWriter.getTotalBytesCopied()); - assertEquals(42L, copyWriter.getBlobSize()); - RestorableState rewriterState = copyWriter.capture(); - CopyWriter restoredRewriter = rewriterState.restore(); - assertEquals(result, restoredRewriter.getResult()); - assertTrue(restoredRewriter.isDone()); - assertEquals(42L, restoredRewriter.getTotalBytesCopied()); - assertEquals(42L, restoredRewriter.getBlobSize()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java index ba9a972cc2..3a4fd7e924 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGapicUnbufferedReadableByteChannelTest.java @@ -127,7 +127,8 @@ public void readRetriesAreProperlyOrdered_readLargerThanMessageSize() .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { c.read(ByteBuffer.wrap(actualBytes)); @@ -155,7 +156,8 @@ public void readRetriesAreProperlyOrdered_readSmallerThanMessageSize() .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; ImmutableList buffers = TestUtils.subDivide(actualBytes, 2); try (UnbufferedReadableByteChannel c = session.open()) { @@ -213,7 +215,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.noop())); + Hasher.noop(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { IOException ioException = @@ -260,7 +263,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.enabled())); + Hasher.enabled(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[40]; try (UnbufferedReadableByteChannel c = session.open()) { IOException ioException = @@ -299,7 +303,8 @@ public void readObject( .withDefaultCallContext( contextWithRetryForCodes(StatusCode.Code.DATA_LOSS)), start, - Hasher.enabled())); + Hasher.enabled(), + ResponseContentLifecycleManager.noop())); byte[] actualBytes = new byte[41]; //noinspection resource UnbufferedReadableByteChannel c = session.open(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java deleted file mode 100644 index 12f1bd6b9a..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGrpcStorageImplUploadRetryTest.java +++ /dev/null @@ -1,310 +0,0 @@ -/* - * Copyright 2022 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.google.cloud.storage; - -import static com.google.cloud.storage.ByteSizeConstants._2MiB; -import static com.google.common.truth.Truth.assertThat; - -import com.google.api.core.ApiFuture; -import com.google.api.gax.grpc.GrpcCallContext; -import com.google.cloud.storage.ITGapicUnbufferedWritableByteChannelTest.DirectWriteService; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.common.collect.ImmutableList; -import com.google.protobuf.ByteString; -import com.google.storage.v2.ChecksummedData; -import com.google.storage.v2.Object; -import com.google.storage.v2.ObjectChecksums; -import com.google.storage.v2.QueryWriteStatusRequest; -import com.google.storage.v2.QueryWriteStatusResponse; -import com.google.storage.v2.StartResumableWriteRequest; -import com.google.storage.v2.StartResumableWriteResponse; -import com.google.storage.v2.StorageGrpc.StorageImplBase; -import com.google.storage.v2.WriteObjectRequest; -import com.google.storage.v2.WriteObjectResponse; -import com.google.storage.v2.WriteObjectSpec; -import io.grpc.Status.Code; -import io.grpc.stub.StreamObserver; -import java.io.InputStream; -import java.nio.channels.Channels; -import java.nio.file.Path; -import java.util.concurrent.atomic.AtomicBoolean; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -/** - * Verify some simplistic retries can take place and that we're constructing {@link - * WriteObjectRequest}s as expected. - */ -public final class ITGrpcStorageImplUploadRetryTest { - private static final String FORMATTED_BUCKET_NAME = "projects/_/buckets/buck"; - private static final int objectContentSize = 64; - private static final byte[] bytes = DataGenerator.base64Characters().genBytes(objectContentSize); - - @Rule public final TemporaryFolder tmpDir = new TemporaryFolder(); - - private Path baseDir; - - @Before - public void setUp() throws Exception { - baseDir = tmpDir.getRoot().toPath(); - } - - @Test - public void create_bytes() throws Exception { - Direct.FakeService service = Direct.FakeService.create(); - - try (FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.create(info, bytes, BlobTargetOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void create_inputStream() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService(); - InputStream in = Channels.newInputStream(tmpFile.reader())) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.create(info, in, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_path_smallerThanBufferSize() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, tmpFile.getPath(), _2MiB, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_path_largerThanBufferSize() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService()) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, tmpFile.getPath(), 16, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void createFrom_inputStream() throws Exception { - Resumable.FakeService service = Resumable.FakeService.create(); - try (TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, objectContentSize); - FakeServer server = FakeServer.of(service); - Storage s = server.getGrpcStorageOptions().getService(); - InputStream in = Channels.newInputStream(tmpFile.reader())) { - BlobInfo info = BlobInfo.newBuilder("buck", "obj").build(); - s.createFrom(info, in, BlobWriteOption.doesNotExist()); - } - - assertThat(service.returnError.get()).isFalse(); - } - - @Test - public void startResumableWrite() throws Exception { - - AtomicBoolean returnError = new AtomicBoolean(true); - StorageImplBase service = - new StorageImplBase() { - @Override - public void startResumableWrite( - StartResumableWriteRequest request, StreamObserver obs) { - if (request.equals(Resumable.startReq)) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(Resumable.startResp); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - } - }; - - try (FakeServer server = FakeServer.of(service); - GrpcStorageImpl s = (GrpcStorageImpl) server.getGrpcStorageOptions().getService()) { - ApiFuture f = - s.startResumableWrite(GrpcCallContext.createDefault(), Resumable.baseReq); - ResumableWrite resumableWrite = f.get(); - StartResumableWriteResponse resp = resumableWrite.getRes(); - assertThat(resp).isNotNull(); - assertThat(resp.getUploadId()).isEqualTo(Resumable.uploadId); - } - - assertThat(returnError.get()).isFalse(); - } - - private static final class Direct { - private static final Object obj = - Object.newBuilder().setBucket(FORMATTED_BUCKET_NAME).setName("obj").build(); - private static final WriteObjectSpec spec = - WriteObjectSpec.newBuilder().setResource(obj).setIfGenerationMatch(0).build(); - - private static final ChecksummedData checksummedData = - TestUtils.getChecksummedData(ByteString.copyFrom(bytes), Hasher.enabled()); - private static final WriteObjectRequest req1 = - WriteObjectRequest.newBuilder() - .setWriteObjectSpec(spec) - .setChecksummedData(checksummedData) - .setObjectChecksums(ObjectChecksums.newBuilder().setCrc32C(checksummedData.getCrc32C())) - .setFinishWrite(true) - .build(); - private static final WriteObjectResponse resp1 = - WriteObjectResponse.newBuilder() - .setResource(obj.toBuilder().setSize(objectContentSize)) - .build(); - - private static final class FakeService extends DirectWriteService { - private final AtomicBoolean returnError; - - private FakeService(AtomicBoolean returnError) { - super( - (obs, reqs) -> { - if (reqs.equals(ImmutableList.of(req1))) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(resp1); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - }); - this.returnError = returnError; - } - - // a bit of constructor lifecycle hackery to appease the compiler - // Even though the thing past to super() is a lazy function, the closing over of the outer - // fields happens earlier than they are available. To side step this fact, we provide the - // AtomicBoolean as a constructor argument which can be closed over without issue, and then - // bind it to the class field after super(). - static Direct.FakeService create() { - return new Direct.FakeService(new AtomicBoolean(true)); - } - } - } - - private static final class Resumable { - - private static final String uploadId = "upload-id"; - - private static final Object obj = - Object.newBuilder().setBucket(FORMATTED_BUCKET_NAME).setName("obj").build(); - private static final WriteObjectSpec spec = - WriteObjectSpec.newBuilder().setResource(obj).setIfGenerationMatch(0).build(); - - private static final WriteObjectRequest baseReq = - WriteObjectRequest.newBuilder().setWriteObjectSpec(spec).build(); - private static final StartResumableWriteRequest startReq = - StartResumableWriteRequest.newBuilder().setWriteObjectSpec(spec).build(); - private static final StartResumableWriteResponse startResp = - StartResumableWriteResponse.newBuilder().setUploadId(uploadId).build(); - - private static final ChecksummedData checksummedData = - TestUtils.getChecksummedData(ByteString.copyFrom(bytes), Hasher.noop()); - private static final WriteObjectRequest req1 = - WriteObjectRequest.newBuilder() - .setUploadId(uploadId) - .setChecksummedData(checksummedData) - .setFinishWrite(true) - .build(); - private static final WriteObjectResponse resp1 = - WriteObjectResponse.newBuilder() - .setResource(obj.toBuilder().setSize(objectContentSize)) - .build(); - - private static final class FakeService extends DirectWriteService { - private final AtomicBoolean returnError; - - private FakeService(AtomicBoolean returnError) { - super( - (obs, reqs) -> { - if (reqs.equals(ImmutableList.of(req1))) { - if (returnError.get()) { - // clear the need to error. We only error on the first request. - returnError.compareAndSet(true, false); - obs.onError(TestUtils.apiException(Code.INTERNAL, "should retry")); - } else { - obs.onNext(resp1); - obs.onCompleted(); - } - } else { - obs.onError( - TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - }); - this.returnError = returnError; - } - - @Override - public void startResumableWrite( - StartResumableWriteRequest request, StreamObserver obs) { - if (request.equals(startReq)) { - obs.onNext(startResp); - obs.onCompleted(); - } else { - obs.onError(TestUtils.apiException(Code.PERMISSION_DENIED, "Unexpected request chain.")); - } - } - - @Override - public void queryWriteStatus( - QueryWriteStatusRequest request, - StreamObserver responseObserver) { - responseObserver.onNext(QueryWriteStatusResponse.newBuilder().setPersistedSize(0).build()); - responseObserver.onCompleted(); - } - - // a bit of constructor lifecycle hackery to appease the compiler - // Even though the thing passed to super() is a lazy function, the closing over of the outer - // fields happens earlier than they are available. To side step this fact, we provide the - // AtomicBoolean as a constructor argument which can be closed over without issue, and then - // bind it to the class field after super(). - static FakeService create() { - return new FakeService(new AtomicBoolean(true)); - } - } - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java index 2e8efa0589..41f6df1de4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITGzipReadableByteChannelTest.java @@ -124,7 +124,9 @@ public void autoGzipDecompress_true() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() @@ -143,7 +145,9 @@ public void autoGzipDecompress_false() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(false) .unbuffered() @@ -193,7 +197,9 @@ public void autoGzipDecompress_true() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() @@ -212,7 +218,9 @@ public void autoGzipDecompress_false() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(false) .unbuffered() @@ -231,7 +239,9 @@ public void autoGzipDecompress_default_disabled() throws IOException { UnbufferedReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(storageClient.getInstance().readObjectCallable()) + .byteChannel( + storageClient.getInstance().readObjectCallable(), + ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .unbuffered() .setReadObjectRequest(reqCompressed) @@ -314,7 +324,7 @@ public void readObject( ReadableByteChannelSession session = ResumableMedia.gapic() .read() - .byteChannel(sc.readObjectCallable()) + .byteChannel(sc.readObjectCallable(), ResponseContentLifecycleManager.noop()) .setHasher(Hasher.noop()) .setAutoGzipDecompression(true) .unbuffered() diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java index f3e3750e2e..d4c25edbde 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionPutTaskTest.java @@ -110,51 +110,6 @@ public void emptyObjectHappyPath() throws Exception { } } - /** - * - * - *

        S.9

        - * - * Partial successful append to session - * - *

        The client has sent N bytes, the server confirmed N bytes as committed. The client sends K - * bytes starting at offset N. The server responds with only N + L with 0 <= L < K bytes as - * committed. - */ - @Test - public void scenario9() throws Exception { - - HttpRequestHandler handler = - req -> { - String contentRangeString = req.headers().get(CONTENT_RANGE); - HttpContentRange parse = HttpContentRange.parse(contentRangeString); - long endInclusive = ((HttpContentRange.HasRange) parse).range().endOffsetInclusive(); - FullHttpResponse resp = - new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); - ByteRangeSpec range = ByteRangeSpec.explicitClosed(0L, endInclusive - 1); - resp.headers().set(HttpHeaderNames.RANGE, range.getHttpRangeHeader()); - return resp; - }; - - try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { - URI endpoint = fakeHttpServer.getEndpoint(); - String uploadUrl = String.format("%s/upload/%s", endpoint.toString(), UUID.randomUUID()); - - AtomicLong confirmedBytes = new AtomicLong(-1L); - - JsonResumableSessionPutTask task = - new JsonResumableSessionPutTask( - httpClientContext, - uploadUrl, - RewindableContent.empty(), - HttpContentRange.of(ByteRangeSpec.explicitClosed(0L, 10L))); - - StorageException se = assertThrows(StorageException.class, task::call); - assertThat(se.getCode()).isEqualTo(503); - assertThat(confirmedBytes.get()).isEqualTo(-1L); - } - } - /** * * diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java index 7336749dbb..2d96828b10 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITJsonResumableSessionTest.java @@ -98,7 +98,7 @@ public void rewindWillQueryStatusOnlyWhenDirty() throws Exception { DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); if (range1.getHeaderValue().equals(contentRange)) { - resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); + return new DefaultFullHttpResponse(req.protocolVersion(), SERVICE_UNAVAILABLE); } else if (range2.getHeaderValue().equals(contentRange)) { resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); } else { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java new file mode 100644 index 0000000000..cf1b0d67d5 --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITUnbufferedResumableUploadTest.java @@ -0,0 +1,117 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.api.core.ApiFutures; +import com.google.api.services.storage.model.StorageObject; +import com.google.cloud.storage.ITUnbufferedResumableUploadTest.ObjectSizes; +import com.google.cloud.storage.TransportCompatibility.Transport; +import com.google.cloud.storage.UnbufferedWritableByteChannelSession.UnbufferedWritableByteChannel; +import com.google.cloud.storage.UnifiedOpts.ObjectTargetOpt; +import com.google.cloud.storage.UnifiedOpts.Opts; +import com.google.cloud.storage.it.runner.StorageITRunner; +import com.google.cloud.storage.it.runner.annotations.Backend; +import com.google.cloud.storage.it.runner.annotations.CrossRun; +import com.google.cloud.storage.it.runner.annotations.CrossRun.Exclude; +import com.google.cloud.storage.it.runner.annotations.Inject; +import com.google.cloud.storage.it.runner.annotations.Parameterized; +import com.google.cloud.storage.it.runner.annotations.Parameterized.Parameter; +import com.google.cloud.storage.it.runner.annotations.Parameterized.ParametersProvider; +import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.cloud.storage.spi.v1.StorageRpc; +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Supplier; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(StorageITRunner.class) +@CrossRun( + backends = {Backend.PROD}, + transports = {Transport.HTTP, Transport.GRPC}) +@Parameterized(ObjectSizes.class) +public final class ITUnbufferedResumableUploadTest { + + @Inject public Storage storage; + @Inject public BucketInfo bucket; + @Inject public Generator generator; + + @Parameter public int objectSize; + + public static final class ObjectSizes implements ParametersProvider { + + @Override + public ImmutableList parameters() { + return ImmutableList.of(256 * 1024, 2 * 1024 * 1024); + } + } + + @Test + @Exclude(transports = Transport.GRPC) + public void json() + throws IOException, ExecutionException, InterruptedException, TimeoutException { + BlobInfo blobInfo = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + Opts opts = Opts.empty(); + final Map optionsMap = opts.getRpcOptions(); + BlobInfo.Builder builder = blobInfo.toBuilder().setMd5(null).setCrc32c(null); + BlobInfo updated = opts.blobInfoMapper().apply(builder).build(); + + StorageObject encode = Conversions.json().blobInfo().encode(updated); + HttpStorageOptions options = (HttpStorageOptions) storage.getOptions(); + Supplier uploadIdSupplier = + ResumableMedia.startUploadForBlobInfo( + options, + updated, + optionsMap, + StorageRetryStrategy.getUniformStorageRetryStrategy().getIdempotentHandler()); + JsonResumableWrite jsonResumableWrite = + JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + + UnbufferedWritableByteChannelSession session = + ResumableMedia.http() + .write() + .byteChannel(HttpClientContext.from(options.getStorageRpcV1())) + .resumable() + .unbuffered() + .setStartAsync(ApiFutures.immediateFuture(jsonResumableWrite)) + .build(); + + int additional = 13; + long size = objectSize + additional; + ByteBuffer b = DataGenerator.base64Characters().genByteBuffer(size); + + UnbufferedWritableByteChannel open = session.open(); + int written = open.write(b); + assertThat(written).isEqualTo(objectSize); + assertThat(b.remaining()).isEqualTo(additional); + + int writtenAndClose = open.writeAndClose(b); + assertThat(writtenAndClose).isEqualTo(additional); + open.close(); + + StorageObject storageObject = session.getResult().get(2, TimeUnit.SECONDS); + assertThat(storageObject.getSize()).isEqualTo(BigInteger.valueOf(size)); + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java deleted file mode 100644 index df8537d64e..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/NotificationTest.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2020 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.google.cloud.storage; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; - -import com.google.cloud.storage.NotificationInfo.EventType; -import com.google.cloud.storage.NotificationInfo.PayloadFormat; -import com.google.common.collect.ImmutableMap; -import java.util.Arrays; -import java.util.Map; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class NotificationTest { - - private static final String ETAG = "0xFF00"; - private static final String SELF_LINK = "http://storage/b/n"; - private static final String OBJECT_NAME_PREFIX = "index.html"; - private static final String TOPIC = "projects/myProject/topics/topic1"; - private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); - private static final PayloadFormat PAYLOAD_FORMAT = PayloadFormat.JSON_API_V1.JSON_API_V1; - private static final EventType[] EVENT_TYPES = { - EventType.OBJECT_FINALIZE, EventType.OBJECT_METADATA_UPDATE - }; - private static final NotificationInfo NOTIFICATION_INFO = - NotificationInfo.newBuilder(TOPIC) - .setEtag(ETAG) - .setCustomAttributes(CUSTOM_ATTRIBUTES) - .setSelfLink(SELF_LINK) - .setEventTypes(EVENT_TYPES) - .setObjectNamePrefix(OBJECT_NAME_PREFIX) - .setPayloadFormat(PAYLOAD_FORMAT) - .build(); - - private Storage storage; - private StorageOptions mockOptions = createMock(StorageOptions.class); - - @Before - public void setUp() { - storage = createStrictMock(Storage.class); - } - - @After - public void tearDown() { - verify(storage); - } - - @Test - public void testBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(2); - replay(storage); - Notification.Builder builder = - new Notification.Builder( - new Notification(storage, new NotificationInfo.BuilderImpl(NOTIFICATION_INFO))); - Notification notification = - builder - .setEtag(ETAG) - .setCustomAttributes(CUSTOM_ATTRIBUTES) - .setSelfLink(SELF_LINK) - .setEventTypes(EVENT_TYPES) - .setObjectNamePrefix(OBJECT_NAME_PREFIX) - .setPayloadFormat(PAYLOAD_FORMAT) - .build(); - assertEquals(ETAG, notification.getEtag()); - assertEquals(SELF_LINK, notification.getSelfLink()); - assertEquals(OBJECT_NAME_PREFIX, notification.getObjectNamePrefix()); - assertEquals(PAYLOAD_FORMAT, notification.getPayloadFormat()); - assertEquals(TOPIC, notification.getTopic()); - assertEquals(CUSTOM_ATTRIBUTES, notification.getCustomAttributes()); - assertEquals(Arrays.asList(EVENT_TYPES), notification.getEventTypes()); - } - - @Test - public void testToBuilder() { - expect(storage.getOptions()).andReturn(mockOptions).times(2); - replay(storage); - Notification notification = - new Notification(storage, new NotificationInfo.BuilderImpl(NOTIFICATION_INFO)); - compareBucketNotification(notification, notification.toBuilder().build()); - } - - @Test - public void testFromPb() { - expect(storage.getOptions()).andReturn(mockOptions).times(1); - replay(storage); - compareBucketNotification( - NOTIFICATION_INFO, - Conversions.json() - .notificationInfo() - .decode(Conversions.json().notificationInfo().encode(NOTIFICATION_INFO)) - .asNotification(storage)); - } - - private void compareBucketNotification(NotificationInfo expected, NotificationInfo actual) { - assertEquals(expected.getNotificationId(), actual.getNotificationId()); - assertEquals(expected.getCustomAttributes(), actual.getCustomAttributes()); - assertEquals(expected.getEtag(), actual.getEtag()); - assertEquals(expected.getSelfLink(), actual.getSelfLink()); - assertEquals(expected.getEventTypes(), actual.getEventTypes()); - assertEquals(expected.getObjectNamePrefix(), actual.getObjectNamePrefix()); - assertEquals(expected.getPayloadFormat(), actual.getPayloadFormat()); - assertEquals(expected.getTopic().trim(), actual.getTopic().trim()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java index 9b577014c5..23b7f3710e 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/PackagePrivateMethodWorkarounds.java @@ -20,7 +20,6 @@ import com.google.api.core.ApiFutures; import com.google.cloud.ReadChannel; import com.google.cloud.WriteChannel; -import com.google.cloud.storage.BucketInfo.BuilderImpl; import com.google.common.collect.ImmutableList; import java.util.Optional; import java.util.concurrent.ExecutionException; @@ -40,23 +39,11 @@ public final class PackagePrivateMethodWorkarounds { private PackagePrivateMethodWorkarounds() {} public static Bucket bucketCopyWithStorage(Bucket b, Storage s) { - BucketInfo.BuilderImpl builder = - (BuilderImpl) - Conversions.json() - .bucketInfo() - .decode(Conversions.json().bucketInfo().encode(b)) - .toBuilder(); - return new Bucket(s, builder); + return b.asBucket(s); } public static Blob blobCopyWithStorage(Blob b, Storage s) { - BlobInfo.BuilderImpl builder = - (BlobInfo.BuilderImpl) - Conversions.json() - .blobInfo() - .decode(Conversions.json().blobInfo().encode(b)) - .toBuilder(); - return new Blob(s, builder); + return b.asBlob(s); } public static Function> maybeGetBlobInfoFunction() { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java index 3a78adf4fe..48bb4137e3 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ParallelCompositeUploadWritableByteChannelTest.java @@ -320,7 +320,7 @@ public void partOpts_stripsPreconditionsAndChecksums_addingIfGenEq0() { "kms-key"); ImmutableMap rpcOptions = partOpts.getRpcOptions(); - assertThat(rpcOptions).isEqualTo(expected); + assertThat(rpcOptions).containsAtLeastEntriesIn(expected); } @Test diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java index 649de1037e..5532364d74 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/PolicyHelperTest.java @@ -17,12 +17,10 @@ package com.google.cloud.storage; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import com.google.api.services.storage.model.Policy.Bindings; import com.google.cloud.Identity; import com.google.cloud.Policy; -import com.google.cloud.storage.testing.ApiPolicyMatcher; import com.google.common.collect.ImmutableList; import java.util.List; import org.junit.Test; @@ -58,11 +56,8 @@ public void testEquivalence() { .setVersion(1); Policy actualLibPolicy = Conversions.json().policyCodec().decode(apiPolicy); - com.google.api.services.storage.model.Policy actualApiPolicy = - Conversions.json().policyCodec().encode(libPolicy); assertEquals(libPolicy, actualLibPolicy); - assertTrue(new ApiPolicyMatcher(apiPolicy).matches(actualApiPolicy)); } @Test diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java new file mode 100644 index 0000000000..b8d7bd5c5d --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/RewindableContentInputStreamTest.java @@ -0,0 +1,96 @@ +/* + * Copyright 2023 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.google.cloud.storage; + +import static com.google.cloud.storage.ByteSizeConstants._256KiB; +import static com.google.cloud.storage.TestUtils.xxd; +import static com.google.common.truth.Truth.assertThat; + +import com.google.protobuf.ByteString; +import java.io.IOException; +import java.nio.ByteBuffer; +import org.junit.Test; + +public final class RewindableContentInputStreamTest { + + @Test + public void read_empty() throws IOException { + RewindableContent content = RewindableContent.empty(); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(); + assertThat(read).isEqualTo(-1); + } + } + + @Test + public void readB_emptySrc() throws IOException { + RewindableContent content = RewindableContent.empty(); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(new byte[1]); + assertThat(read).isEqualTo(-1); + } + } + + @Test + public void readB_emptyDst() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[0]; + int read = in.read(tmp); + assertThat(read).isEqualTo(0); + } + } + + @Test + public void readB_singleByte() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[_256KiB]; + int read = in.read(tmp); + assertThat(read).isEqualTo(1); + assertThat(tmp[0]).isEqualTo(bytes[0]); + } + } + + @Test + public void read_singleByte() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(1); + RewindableContent content = RewindableContent.of(ByteBuffer.wrap(bytes)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + int read = in.read(); + assertThat(read).isEqualTo(bytes[0]); + } + } + + @Test + public void readB_multiContent() throws IOException { + byte[] bytes = DataGenerator.base64Characters().genBytes(30); + RewindableContent content = + RewindableContent.of( + ByteBuffer.wrap(bytes, 0, 10), + ByteBuffer.wrap(bytes, 10, 10), + ByteBuffer.wrap(bytes, 20, 10)); + try (RewindableContentInputStream in = new RewindableContentInputStream(content)) { + byte[] tmp = new byte[_256KiB]; + int read = in.read(tmp); + assertThat(read).isEqualTo(30); + assertThat(xxd(ByteString.copyFrom(tmp, 0, read))).isEqualTo(xxd(bytes)); + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java deleted file mode 100644 index 8f3ca3fd31..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchResultTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2016 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.google.cloud.storage; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.cloud.BatchResult; -import java.io.IOException; -import org.easymock.EasyMock; -import org.junit.Before; -import org.junit.Test; - -public class StorageBatchResultTest { - - private StorageBatchResult result; - - @Before - public void setUp() { - result = new StorageBatchResult<>(); - } - - @Test - public void testSuccess() { - assertFalse(result.completed()); - try { - result.get(); - fail("This was not completed yet."); - } catch (IllegalStateException ex) { - // expected - } - result.success(true); - assertTrue(result.get()); - } - - @Test - public void testError() { - assertFalse(result.completed()); - try { - result.get(); - fail("This was not completed yet."); - } catch (IllegalStateException ex) { - // expected - } - StorageException ex = new StorageException(new IOException("some error")); - result.error(ex); - try { - result.get(); - fail("This is a failed operation and should have thrown a StorageException."); - } catch (StorageException real) { - assertSame(ex, real); - } - } - - @Test - public void testNotifyError() { - StorageException ex = new StorageException(new IOException("some error")); - assertFalse(result.completed()); - BatchResult.Callback callback = - EasyMock.createStrictMock(BatchResult.Callback.class); - callback.error(ex); - EasyMock.replay(callback); - result.notify(callback); - result.error(ex); - try { - result.notify(callback); - fail("The batch has been completed."); - } catch (IllegalStateException exception) { - // expected - } - EasyMock.verify(callback); - } - - @Test - public void testNotifySuccess() { - assertFalse(result.completed()); - BatchResult.Callback callback = - EasyMock.createStrictMock(BatchResult.Callback.class); - callback.success(true); - EasyMock.replay(callback); - result.notify(callback); - result.success(true); - try { - result.notify(callback); - fail("The batch has been completed."); - } catch (IllegalStateException exception) { - // expected - } - EasyMock.verify(callback); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java deleted file mode 100644 index 46f2461f99..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageBatchTest.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright 2016 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.google.cloud.storage; - -import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.services.storage.model.StorageObject; -import com.google.cloud.storage.Storage.BlobGetOption; -import com.google.cloud.storage.Storage.BlobSourceOption; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.spi.v1.HttpStorageRpc; -import com.google.cloud.storage.spi.v1.RpcBatch; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import org.easymock.Capture; -import org.easymock.EasyMock; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -public class StorageBatchTest { - - private static final BlobId BLOB_ID = BlobId.of("b1", "n1"); - private static final BlobId BLOB_ID_COMPLETE = BlobId.of("b1", "n1", 42L); - private static final BlobInfo BLOB_INFO = BlobInfo.newBuilder(BLOB_ID).build(); - private static final BlobInfo BLOB_INFO_COMPLETE = - BlobInfo.newBuilder(BLOB_ID_COMPLETE).setMetageneration(42L).build(); - private static final BlobGetOption[] BLOB_GET_OPTIONS = { - BlobGetOption.generationMatch(42L), BlobGetOption.metagenerationMatch(42L) - }; - private static final BlobSourceOption[] BLOB_SOURCE_OPTIONS = { - BlobSourceOption.generationMatch(42L), BlobSourceOption.metagenerationMatch(42L) - }; - private static final GoogleJsonError GOOGLE_JSON_ERROR = new GoogleJsonError(); - private final HttpRetryAlgorithmManager retryAlgorithmManager = - HttpStorageOptions.getDefaultInstance().getRetryAlgorithmManager(); - - private HttpStorageOptions optionsMock; - private HttpStorageRpc storageRpcMock; - private RpcBatch batchMock; - private StorageBatch storageBatch; - private final Storage storage = EasyMock.createStrictMock(Storage.class); - - @Before - public void setUp() { - optionsMock = EasyMock.createMock(HttpStorageOptions.class); - storageRpcMock = EasyMock.createMock(HttpStorageRpc.class); - batchMock = EasyMock.createMock(RpcBatch.class); - EasyMock.expect(optionsMock.getStorageRpcV1()).andReturn(storageRpcMock); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - EasyMock.replay(optionsMock, storageRpcMock, batchMock, storage); - storageBatch = new StorageBatch(optionsMock); - } - - @After - public void tearDown() { - EasyMock.verify(batchMock, storageRpcMock, optionsMock, storage); - } - - @Test - public void testConstructor() { - assertSame(batchMock, storageBatch.getBatch()); - assertSame(optionsMock, storageBatch.getOptions()); - assertSame(storageRpcMock, storageBatch.getStorageRpc()); - } - - @Test - public void testDelete() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = - storageBatch.delete(BLOB_ID.getBucket(), BLOB_ID.getName()); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testDeleteWithOptions() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.delete(BLOB_ID, BLOB_SOURCE_OPTIONS); - assertNotNull(callback.getValue()); - Map options = capturedOptions.getValue(); - assertEquals(2, options.size()); - assertThat(options).containsEntry(StorageRpc.Option.IF_GENERATION_MATCH, 42L); - assertThat(options).containsEntry(StorageRpc.Option.IF_METAGENERATION_MATCH, 42L); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(null); - assertTrue(batchResult.get()); - } - - @Test - public void testUpdate() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.update(BLOB_INFO); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testUpdateWithOptions() { - EasyMock.reset(storage, batchMock, optionsMock); - EasyMock.expect(storage.getOptions()).andReturn(optionsMock).anyTimes(); - EasyMock.expect(optionsMock.getService()).andReturn(storage).anyTimes(); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO_COMPLETE)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(batchMock, storage, optionsMock); - StorageBatchResult batchResult = - storageBatch.update( - BLOB_INFO_COMPLETE, - BlobTargetOption.generationMatch(), - BlobTargetOption.metagenerationMatch()); - assertNotNull(callback.getValue()); - assertEquals(2, capturedOptions.getValue().size()); - assertEquals(42L, capturedOptions.getValue().get(StorageRpc.Option.IF_GENERATION_MATCH)); - assertEquals(42L, capturedOptions.getValue().get(StorageRpc.Option.IF_METAGENERATION_MATCH)); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO)); - assertEquals(new Blob(storage, new Blob.BuilderImpl(BLOB_INFO)), batchResult.get()); - } - - @Test - public void testGet() { - EasyMock.reset(batchMock); - Capture> callback = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.eq(ImmutableMap.of())); - EasyMock.replay(batchMock); - StorageBatchResult batchResult = storageBatch.get(BLOB_ID.getBucket(), BLOB_ID.getName()); - assertNotNull(callback.getValue()); - try { - batchResult.get(); - fail("No result available yet."); - } catch (IllegalStateException ex) { - // expected - } - // testing error here, success is tested with options - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onFailure(GOOGLE_JSON_ERROR); - try { - batchResult.get(); - fail("Should throw a StorageExcetion on error."); - } catch (StorageException ex) { - // expected - } - } - - @Test - public void testGetWithOptions() { - EasyMock.reset(storage, batchMock, optionsMock); - EasyMock.expect(storage.getOptions()).andReturn(optionsMock).anyTimes(); - EasyMock.expect(optionsMock.getService()).andReturn(storage).anyTimes(); - EasyMock.expect(optionsMock.getRetryAlgorithmManager()) - .andReturn(retryAlgorithmManager) - .anyTimes(); - Capture> callback = Capture.newInstance(); - Capture> capturedOptions = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO)), - EasyMock.capture(callback), - EasyMock.capture(capturedOptions)); - EasyMock.replay(storage, batchMock, optionsMock); - StorageBatchResult batchResult = storageBatch.get(BLOB_ID, BLOB_GET_OPTIONS); - assertNotNull(callback.getValue()); - Map options = capturedOptions.getValue(); - assertEquals(2, options.size()); - assertThat(options).containsEntry(StorageRpc.Option.IF_GENERATION_MATCH, 42L); - assertThat(options).containsEntry(StorageRpc.Option.IF_METAGENERATION_MATCH, 42L); - RpcBatch.Callback capturedCallback = callback.getValue(); - capturedCallback.onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO)); - assertEquals(new Blob(storage, new Blob.BuilderImpl(BLOB_INFO)), batchResult.get()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java deleted file mode 100644 index 0051cac498..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageExceptionTest.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.http.HttpHeaders; -import com.google.api.client.http.HttpResponseException; -import com.google.cloud.BaseServiceException; -import com.google.cloud.RetryHelper.RetryHelperException; -import java.io.IOException; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import javax.net.ssl.SSLException; -import org.junit.Test; - -public class StorageExceptionTest { - - @Test - public void testStorageException() { - StorageException exception = new StorageException(500, "message"); - assertEquals(500, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(502, "message"); - assertEquals(502, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(503, "message"); - assertEquals(503, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(504, "message"); - assertEquals(504, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(429, "message"); - assertEquals(429, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(408, "message"); - assertEquals(408, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(400, "message"); - assertEquals(400, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertFalse(exception.isRetryable()); - - IOException cause = new SocketTimeoutException(); - exception = new StorageException(cause); - assertNull(exception.getReason()); - assertNull(exception.getMessage()); - assertTrue(exception.isRetryable()); - assertSame(cause, exception.getCause()); - - GoogleJsonError error = new GoogleJsonError(); - error.setCode(503); - error.setMessage("message"); - exception = new StorageException(error); - assertEquals(503, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertTrue(exception.isRetryable()); - - exception = new StorageException(400, "message", cause); - assertEquals(400, exception.getCode()); - assertEquals("message", exception.getMessage()); - assertNull(exception.getReason()); - assertFalse(exception.isRetryable()); - assertSame(cause, exception.getCause()); - - HttpResponseException httpResponseException = - new HttpResponseException.Builder(404, "Service Unavailable", new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(404, exception.getCode()); - assertFalse(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(503, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(503, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(502, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(502, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(500, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(500, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(429, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(429, exception.getCode()); - assertTrue(exception.isRetryable()); - - httpResponseException = new HttpResponseException.Builder(408, null, new HttpHeaders()).build(); - exception = new StorageException(httpResponseException); - assertEquals(408, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionReset() { - StorageException exception = - StorageException.translate( - new SSLException( - "Connection has been shutdown: " - + new SSLException(new SocketException("Connection reset")))); - assertEquals(0, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionShutdown() { - StorageException exception = - StorageException.translate( - new SSLException( - "Connection has been shutdown: " - + new SSLException(new SocketException("Socket closed")))); - String test = exception.getMessage(); - - assertEquals(0, exception.getCode()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateConnectionClosedPrematurely() { - StorageException exception = - StorageException.translate( - new IOException( - "Connection closed prematurely: bytesRead = 1114112, Content-Length = 10485760")); - assertEquals(0, exception.getCode()); - assertEquals("connectionClosedPrematurely", exception.getReason()); - assertTrue(exception.isRetryable()); - } - - @Test - public void testTranslateAndThrow() throws Exception { - Exception cause = new StorageException(503, "message"); - RetryHelperException exceptionMock = createMock(RetryHelperException.class); - expect(exceptionMock.getCause()).andReturn(cause).times(2); - replay(exceptionMock); - try { - StorageException.translateAndThrow(exceptionMock); - } catch (BaseServiceException ex) { - assertEquals(503, ex.getCode()); - assertEquals("message", ex.getMessage()); - assertTrue(ex.isRetryable()); - } finally { - verify(exceptionMock); - } - cause = new IllegalArgumentException("message"); - exceptionMock = createMock(RetryHelperException.class); - expect(exceptionMock.getMessage()).andReturn("message").times(1); - expect(exceptionMock.getCause()).andReturn(cause).times(2); - replay(exceptionMock); - try { - StorageException.translateAndThrow(exceptionMock); - } catch (BaseServiceException ex) { - assertEquals(StorageException.UNKNOWN_CODE, ex.getCode()); - assertEquals("message", ex.getMessage()); - assertFalse(ex.isRetryable()); - assertSame(cause, ex.getCause()); - } finally { - verify(exceptionMock); - } - } -} 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 deleted file mode 100644 index bda9d6a8bd..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java +++ /dev/null @@ -1,2344 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage; - -import static com.google.cloud.storage.SignedUrlEncodingHelper.Rfc3986UriEncode; -import static com.google.cloud.storage.testing.ApiPolicyMatcher.eqApiPolicy; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.easymock.EasyMock.anyObject; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.getCurrentArguments; -import static org.easymock.EasyMock.replay; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import com.google.api.client.googleapis.json.GoogleJsonError; -import com.google.api.client.util.DateTime; -import com.google.api.core.ApiClock; -import com.google.api.gax.retrying.RetrySettings; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.api.services.storage.model.StorageObject; -import com.google.api.services.storage.model.TestIamPermissionsResponse; -import com.google.auth.oauth2.ServiceAccountCredentials; -import com.google.cloud.Identity; -import com.google.cloud.Policy; -import com.google.cloud.ServiceOptions; -import com.google.cloud.storage.Acl.Project; -import com.google.cloud.storage.Acl.Project.ProjectRole; -import com.google.cloud.storage.Acl.Role; -import com.google.cloud.storage.Acl.User; -import com.google.cloud.storage.Storage.BlobSourceOption; -import com.google.cloud.storage.Storage.BlobTargetOption; -import com.google.cloud.storage.Storage.BucketSourceOption; -import com.google.cloud.storage.Storage.CopyRequest; -import com.google.cloud.storage.spi.StorageRpcFactory; -import com.google.cloud.storage.spi.v1.RpcBatch; -import com.google.cloud.storage.spi.v1.StorageRpc; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.io.BaseEncoding; -import java.io.File; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.URL; -import java.net.URLDecoder; -import java.nio.file.Files; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.KeyFactory; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.spec.EncodedKeySpec; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import javax.crypto.spec.SecretKeySpec; -import org.easymock.Capture; -import org.easymock.EasyMock; -import org.easymock.IAnswer; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -public class StorageImplTest { - - private static final String BUCKET_NAME1 = "b1"; - private static final String BUCKET_NAME2 = "b2"; - private static final String BUCKET_NAME3 = "b3"; - private static final String BLOB_NAME1 = "n1"; - private static final String BLOB_NAME2 = "n2"; - private static final String BLOB_NAME3 = "n3"; - private static final byte[] BLOB_CONTENT = {0xD, 0xE, 0xA, 0xD}; - private static final String BASE64_KEY = "JVzfVl8NLD9FjedFuStegjRfES5ll5zc59CIXw572OA="; - private static final Key KEY = - new SecretKeySpec(BaseEncoding.base64().decode(BASE64_KEY), "AES256"); - private static final String KMS_KEY_NAME = - "projects/gcloud-devel/locations/us/keyRings/gcs_kms_key_ring_us/cryptoKeys/key"; - private static final Long RETENTION_PERIOD = 10L; - private static final String USER_PROJECT = "test-project"; - // BucketInfo objects - private static final BucketInfo BUCKET_INFO1 = - BucketInfo.newBuilder(BUCKET_NAME1).setMetageneration(42L).build(); - private static final BucketInfo BUCKET_INFO2 = BucketInfo.newBuilder(BUCKET_NAME2).build(); - private static final BucketInfo BUCKET_INFO3 = - BucketInfo.newBuilder(BUCKET_NAME3) - .setRetentionPeriod(RETENTION_PERIOD) - .setRetentionPolicyIsLocked(true) - .setMetageneration(42L) - .build(); - - // BlobInfo objects - private static final BlobInfo BLOB_INFO1 = - BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME1, 24L) - .setMetageneration(42L) - .setContentType("application/json") - .setMd5("md5string") - .build(); - private static final BlobInfo BLOB_INFO2 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME2).build(); - private static final BlobInfo BLOB_INFO3 = BlobInfo.newBuilder(BUCKET_NAME1, BLOB_NAME3).build(); - - // Empty StorageRpc options - private static final Map EMPTY_RPC_OPTIONS = ImmutableMap.of(); - - // Bucket target options - private static final Storage.BucketTargetOption BUCKET_TARGET_METAGENERATION = - Storage.BucketTargetOption.metagenerationMatch(); - private static final Storage.BucketTargetOption BUCKET_TARGET_PREDEFINED_ACL = - Storage.BucketTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE); - private static final Storage.BucketTargetOption BUCKET_TARGET_USER_PROJECT = - Storage.BucketTargetOption.userProject(USER_PROJECT); - private static final Map BUCKET_TARGET_OPTIONS = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration(), - StorageRpc.Option.PREDEFINED_ACL, Storage.PredefinedAcl.PRIVATE.getEntry()); - private static final Map BUCKET_TARGET_OPTIONS_LOCK_RETENTION_POLICY = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, - BUCKET_INFO3.getMetageneration(), - StorageRpc.Option.USER_PROJECT, - USER_PROJECT); - - // Blob target options (create, update, compose) - private static final BlobTargetOption BLOB_TARGET_GENERATION = BlobTargetOption.generationMatch(); - private static final BlobTargetOption BLOB_TARGET_METAGENERATION = - BlobTargetOption.metagenerationMatch(); - private static final BlobTargetOption BLOB_TARGET_PREDEFINED_ACL = - BlobTargetOption.predefinedAcl(Storage.PredefinedAcl.PRIVATE); - private static final Map BLOB_TARGET_OPTIONS_UPDATE = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(), - StorageRpc.Option.PREDEFINED_ACL, Storage.PredefinedAcl.PRIVATE.getEntry()); - private static final Map BLOB_TARGET_OPTIONS_COMPOSE = - ImmutableMap.of( - StorageRpc.Option.IF_GENERATION_MATCH, BLOB_INFO1.getGeneration(), - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration()); - - // Bucket get/source options - private static final BucketSourceOption BUCKET_SOURCE_METAGENERATION = - BucketSourceOption.metagenerationMatch(BUCKET_INFO1.getMetageneration()); - private static final Map BUCKET_SOURCE_OPTIONS = - ImmutableMap.of(StorageRpc.Option.IF_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration()); - - private static final BlobSourceOption BLOB_SOURCE_METAGENERATION = - BlobSourceOption.metagenerationMatch(BLOB_INFO1.getMetageneration()); - private static final BlobSourceOption BLOB_SOURCE_GENERATION = - BlobSourceOption.generationMatch(BLOB_INFO1.getGeneration()); - private static final BlobSourceOption BLOB_SOURCE_GENERATION_FROM_BLOB_ID = - BlobSourceOption.generationMatch(); - private static final Map BLOB_SOURCE_OPTIONS = - ImmutableMap.of( - StorageRpc.Option.IF_METAGENERATION_MATCH, BLOB_INFO1.getMetageneration(), - StorageRpc.Option.IF_GENERATION_MATCH, BLOB_INFO1.getGeneration()); - private static final Map BLOB_SOURCE_OPTIONS_COPY = - ImmutableMap.of( - StorageRpc.Option.IF_SOURCE_METAGENERATION_MATCH, BUCKET_INFO1.getMetageneration(), - StorageRpc.Option.IF_SOURCE_GENERATION_MATCH, BLOB_INFO1.getGeneration()); - - // ACLs - private static final Acl ACL = Acl.of(User.ofAllAuthenticatedUsers(), Role.OWNER); - private static final Acl OTHER_ACL = Acl.of(new Project(ProjectRole.OWNERS, "p"), Role.READER); - - // Customer supplied encryption key options - private static final Map ENCRYPTION_KEY_OPTIONS = - ImmutableMap.of(StorageRpc.Option.CUSTOMER_SUPPLIED_KEY, BASE64_KEY); - - // Customer managed encryption key options - private static final Map KMS_KEY_NAME_OPTIONS = - ImmutableMap.of(StorageRpc.Option.KMS_KEY_NAME, KMS_KEY_NAME); - // IAM policies - private static final String POLICY_ETAG1 = "CAE="; - private static final String POLICY_ETAG2 = "CAI="; - private static final Policy LIB_POLICY1 = - Policy.newBuilder() - .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) - .addIdentity( - StorageRoles.objectAdmin(), - Identity.user("test1@gmail.com"), - Identity.user("test2@gmail.com")) - .setEtag(POLICY_ETAG1) - .setVersion(1) - .build(); - - private static final ServiceAccount SERVICE_ACCOUNT = ServiceAccount.of("test@google.com"); - - private static final com.google.api.services.storage.model.Policy API_POLICY1 = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"))) - .setEtag(POLICY_ETAG1) - .setVersion(1); - - private static final String PRIVATE_KEY_STRING = - "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoG" - + "BAL2xolH1zrISQ8+GzOV29BNjjzq4/HIP8Psd1+cZb81vDklSF+95wB250MSE0BDc81pvIMwj5OmIfLg1NY6uB" - + "1xavOPpVdx1z664AGc/BEJ1zInXGXaQ6s+SxGenVq40Yws57gikQGMZjttpf1Qbz4DjkxsbRoeaRHn06n9pH1e" - + "jAgMBAAECgYEAkWcm0AJF5LMhbWKbjkxm/LG06UNApkHX6vTOOOODkonM/qDBnhvKCj8Tan+PaU2j7679Cd19q" - + "xCm4SBQJET7eBhqLD9L2j9y0h2YUQnLbISaqUS1/EXcr2C1Lf9VCEn1y/GYuDYqs85rGoQ4ZYfM9ClROSq86fH" - + "+cbIIssqJqukCQQD18LjfJz/ichFeli5/l1jaFid2XoCH3T6TVuuysszVx68fh60gSIxEF/0X2xB+wuPxTP4IQ" - + "+t8tD/ktd232oWXAkEAxXPych2QBHePk9/lek4tOkKBgfnDzex7S/pI0G1vpB3VmzBbCsokn9lpOv7JV8071GD" - + "lW/7R6jlLfpQy3hN31QJAE10osSk99m5Uv8XDU3hvHnywDrnSFOBulNs7I47AYfSe7TSZhPkxUgsxejddTR27J" - + "LyTI8N1PxRSE4feNSOXcQJAMMKJRJT4U6IS2rmXubREhvaVdLtxFxEnAYQ1JwNfZm/XqBMw6GEy2iaeTetNXVl" - + "ZRQEIoscyn1y2v/No/F5iYQJBAKBOGASoQcBjGTOg/H/SfcE8QVNsKEpthRrs6CkpT80aZ/AV+ksfoIf2zw2M3" - + "mAHfrO+TBLdz4sicuFQvlN9SEc="; - - private static final String PUBLIC_KEY_STRING = - "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9saJR9c6y" - + "EkPPhszldvQTY486uPxyD/D7HdfnGW/Nbw5JUhfvecAdudDEhNAQ3PNabyDMI+TpiHy4NTWOrgdcWrzj6VXcdc" - + "+uuABnPwRCdcyJ1xl2kOrPksRnp1auNGMLOe4IpEBjGY7baX9UG8+A45MbG0aHmkR59Op/aR9XowIDAQAB"; - - private static final ApiClock TIME_SOURCE = - new ApiClock() { - @Override - public long nanoTime() { - return 42_000_000_000L; - } - - @Override - public long millisTime() { - return 42_000L; - } - }; - - // List of chars under test were taken from - // https://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters - private static final Map RFC3986_URI_ENCODING_MAP = - ImmutableMap.builder() - .put('!', "%21") - .put('#', "%23") - .put('$', "%24") - .put('&', "%26") - .put('\'', "%27") - .put('(', "%28") - .put(')', "%29") - .put('*', "%2A") - .put('+', "%2B") - .put(',', "%2C") - // NOTE: Whether the forward slash character should be encoded depends on the URI segment - // being encoded. The path segment should not encode forward slashes, but others (e.g. - // query parameter keys and values) should encode them. Tests verifying encoding behavior - // in path segments should make a copy of this map and replace the mapping for '/' to "/". - .put('/', "%2F") - .put(':', "%3A") - .put(';', "%3B") - .put('=', "%3D") - .put('?', "%3F") - .put('@', "%40") - .put('[', "%5B") - .put(']', "%5D") - // In addition to [a-zA-Z0-9], these chars should not be URI-encoded: - .put('-', "-") - .put('_', "_") - .put('.', ".") - .put('~', "~") - .build(); - - private static final String ACCOUNT = "account"; - private static PrivateKey privateKey; - private static PublicKey publicKey; - - private StorageOptions options; - private StorageRpcFactory rpcFactoryMock; - private StorageRpc storageRpcMock; - private Storage storage; - - private Blob expectedBlob1, expectedBlob2, expectedBlob3; - private Bucket expectedBucket1, expectedBucket2, expectedBucket3; - - @BeforeClass - public static void beforeClass() throws NoSuchAlgorithmException, InvalidKeySpecException { - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - EncodedKeySpec privateKeySpec = - new PKCS8EncodedKeySpec(BaseEncoding.base64().decode(PRIVATE_KEY_STRING)); - privateKey = keyFactory.generatePrivate(privateKeySpec); - EncodedKeySpec publicKeySpec = - new X509EncodedKeySpec(BaseEncoding.base64().decode(PUBLIC_KEY_STRING)); - publicKey = keyFactory.generatePublic(publicKeySpec); - } - - @Before - public void setUp() { - rpcFactoryMock = EasyMock.createMock(StorageRpcFactory.class); - storageRpcMock = EasyMock.createMock(StorageRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(StorageOptions.class))) - .andReturn(storageRpcMock); - EasyMock.replay(rpcFactoryMock); - options = - StorageOptions.http() - .setProjectId("projectId") - .setClock(TIME_SOURCE) - .setServiceRpcFactory(rpcFactoryMock) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - } - - @After - public void tearDown() throws Exception { - EasyMock.verify(rpcFactoryMock, storageRpcMock); - } - - private void initializeService() { - storage = options.getService(); - initializeServiceDependentObjects(); - } - - private void initializeServiceDependentObjects() { - expectedBlob1 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)); - expectedBlob2 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO2)); - expectedBlob3 = new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO3)); - expectedBucket1 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO1)); - expectedBucket2 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO2)); - expectedBucket3 = new Bucket(storage, new BucketInfo.BuilderImpl(BUCKET_INFO3)); - } - - @Test - public void testUpdateBucket() { - BucketInfo updatedBucketInfo = BUCKET_INFO1.toBuilder().setIndexPage("some-page").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().bucketInfo().encode(updatedBucketInfo), EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().bucketInfo().encode(updatedBucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = storage.update(updatedBucketInfo); - assertEquals(new Bucket(storage, new BucketInfo.BuilderImpl(updatedBucketInfo)), bucket); - } - - @Test - public void testUpdateBucketWithOptions() { - BucketInfo updatedBucketInfo = BUCKET_INFO1.toBuilder().setIndexPage("some-page").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().bucketInfo().encode(updatedBucketInfo), BUCKET_TARGET_OPTIONS)) - .andReturn(Conversions.json().bucketInfo().encode(updatedBucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = - storage.update( - updatedBucketInfo, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_PREDEFINED_ACL); - assertEquals(new Bucket(storage, new BucketInfo.BuilderImpl(updatedBucketInfo)), bucket); - } - - @Test - public void testUpdateBlob() { - BlobInfo updatedBlobInfo = BLOB_INFO1.toBuilder().setContentType("some-content-type").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().blobInfo().encode(updatedBlobInfo), EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().blobInfo().encode(updatedBlobInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.update(updatedBlobInfo); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(updatedBlobInfo)), blob); - } - - @Test - public void testUpdateBlobWithOptions() { - BlobInfo updatedBlobInfo = BLOB_INFO1.toBuilder().setContentType("some-content-type").build(); - EasyMock.expect( - storageRpcMock.patch( - Conversions.json().blobInfo().encode(updatedBlobInfo), BLOB_TARGET_OPTIONS_UPDATE)) - .andReturn(Conversions.json().blobInfo().encode(updatedBlobInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = - storage.update(updatedBlobInfo, BLOB_TARGET_METAGENERATION, BLOB_TARGET_PREDEFINED_ACL); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(updatedBlobInfo)), blob); - } - - @Test - public void testDeleteBucket() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().bucketInfo().encode(BucketInfo.of(BUCKET_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1)); - } - - @Test - public void testDeleteBucketWithOptions() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().bucketInfo().encode(BucketInfo.of(BUCKET_NAME1)), - BUCKET_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1, BUCKET_SOURCE_METAGENERATION)); - } - - @Test - public void testDeleteBlob() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.delete(BUCKET_NAME1, BLOB_NAME1)); - } - - @Test - public void testDeleteBlobWithOptions() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - BLOB_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue( - storage.delete( - BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION)); - } - - @Test - public void testDeleteBlobWithOptionsFromBlobId() { - EasyMock.expect( - storageRpcMock.delete( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), BLOB_SOURCE_OPTIONS)) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue( - storage.delete( - BLOB_INFO1.getBlobId(), - BLOB_SOURCE_GENERATION_FROM_BLOB_ID, - BLOB_SOURCE_METAGENERATION)); - } - - @Test - public void testCompose() { - Storage.ComposeRequest req = - Storage.ComposeRequest.newBuilder() - .addSource(BLOB_NAME2, BLOB_NAME3) - .setTarget(BLOB_INFO1) - .build(); - EasyMock.expect( - storageRpcMock.compose( - ImmutableList.of( - Conversions.json().blobInfo().encode(BLOB_INFO2), - Conversions.json().blobInfo().encode(BLOB_INFO3)), - Conversions.json().blobInfo().encode(BLOB_INFO1), - EMPTY_RPC_OPTIONS)) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.compose(req); - assertEquals(expectedBlob1, blob); - } - - @Test - public void testComposeWithOptions() { - Storage.ComposeRequest req = - Storage.ComposeRequest.newBuilder() - .addSource(BLOB_NAME2, BLOB_NAME3) - .setTarget(BLOB_INFO1) - .setTargetOptions(BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - EasyMock.expect( - storageRpcMock.compose( - ImmutableList.of( - Conversions.json().blobInfo().encode(BLOB_INFO2), - Conversions.json().blobInfo().encode(BLOB_INFO3)), - Conversions.json().blobInfo().encode(BLOB_INFO1), - BLOB_TARGET_OPTIONS_COMPOSE)) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - initializeService(); - Blob blob = storage.compose(req); - assertEquals(expectedBlob1, blob); - } - - @Test - public void testCopy() { - CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - EMPTY_RPC_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO2), - EMPTY_RPC_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithOptions() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION) - .setTarget(BLOB_INFO1, BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - BLOB_SOURCE_OPTIONS_COPY, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - BLOB_TARGET_OPTIONS_COMPOSE, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithEncryptionKey() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.encryptionKey(BASE64_KEY)) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - ENCRYPTION_KEY_OPTIONS, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - ENCRYPTION_KEY_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse).times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(BASE64_KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.encryptionKey(KEY)) - .build(); - writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyFromEncryptionKeyToKmsKeyName() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.kmsKeyName(KMS_KEY_NAME)) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - ENCRYPTION_KEY_OPTIONS, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - KMS_KEY_NAME_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse).times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO2.getBlobId()) - .setSourceOptions(BlobSourceOption.decryptionKey(BASE64_KEY)) - .setTarget(BLOB_INFO1, BlobTargetOption.kmsKeyName(KMS_KEY_NAME)) - .build(); - writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyWithOptionsFromBlobId() { - CopyRequest request = - Storage.CopyRequest.newBuilder() - .setSource(BLOB_INFO1.getBlobId()) - .setSourceOptions(BLOB_SOURCE_GENERATION_FROM_BLOB_ID, BLOB_SOURCE_METAGENERATION) - .setTarget(BLOB_INFO1, BLOB_TARGET_GENERATION, BLOB_TARGET_METAGENERATION) - .build(); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - BLOB_SOURCE_OPTIONS_COPY, - true, - Conversions.json().blobInfo().encode(request.getTarget()), - BLOB_TARGET_OPTIONS_COMPOSE, - null); - StorageRpc.RewriteResponse rpcResponse = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - } - - @Test - public void testCopyMultipleRequests() { - CopyRequest request = Storage.CopyRequest.of(BLOB_INFO1.getBlobId(), BLOB_INFO2.getBlobId()); - StorageRpc.RewriteRequest rpcRequest = - new StorageRpc.RewriteRequest( - Conversions.json().blobId().encode(request.getSource()), - EMPTY_RPC_OPTIONS, - false, - Conversions.json().blobInfo().encode(BLOB_INFO2), - EMPTY_RPC_OPTIONS, - null); - StorageRpc.RewriteResponse rpcResponse1 = - new StorageRpc.RewriteResponse(rpcRequest, null, 42L, false, "token", 21L); - StorageRpc.RewriteResponse rpcResponse2 = - new StorageRpc.RewriteResponse( - rpcRequest, Conversions.json().blobInfo().encode(BLOB_INFO1), 42L, true, "token", 42L); - EasyMock.expect(storageRpcMock.openRewrite(rpcRequest)).andReturn(rpcResponse1); - EasyMock.expect(storageRpcMock.continueRewrite(rpcResponse1)).andReturn(rpcResponse2); - EasyMock.replay(storageRpcMock); - initializeService(); - CopyWriter writer = storage.copy(request); - assertEquals(42L, writer.getBlobSize()); - assertEquals(21L, writer.getTotalBytesCopied()); - assertTrue(!writer.isDone()); - assertEquals(expectedBlob1, writer.getResult()); - assertTrue(writer.isDone()); - assertEquals(42L, writer.getTotalBytesCopied()); - assertEquals(42L, writer.getBlobSize()); - } - - @Test - public void testReadAllBytes() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - EMPTY_RPC_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesWithOptions() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - BLOB_SOURCE_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes( - BUCKET_NAME1, BLOB_NAME1, BLOB_SOURCE_GENERATION, BLOB_SOURCE_METAGENERATION); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesWithDecriptionKey() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BlobId.of(BUCKET_NAME1, BLOB_NAME1)), - ENCRYPTION_KEY_OPTIONS)) - .andReturn(BLOB_CONTENT) - .times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - readBytes = - storage.readAllBytes(BUCKET_NAME1, BLOB_NAME1, BlobSourceOption.decryptionKey(BASE64_KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesFromBlobIdWithOptions() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), BLOB_SOURCE_OPTIONS)) - .andReturn(BLOB_CONTENT); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes( - BLOB_INFO1.getBlobId(), - BLOB_SOURCE_GENERATION_FROM_BLOB_ID, - BLOB_SOURCE_METAGENERATION); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testReadAllBytesFromBlobIdWithDecriptionKey() { - EasyMock.expect( - storageRpcMock.load( - Conversions.json().blobId().encode(BLOB_INFO1.getBlobId()), ENCRYPTION_KEY_OPTIONS)) - .andReturn(BLOB_CONTENT) - .times(2); - EasyMock.replay(storageRpcMock); - initializeService(); - byte[] readBytes = - storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - readBytes = - storage.readAllBytes(BLOB_INFO1.getBlobId(), BlobSourceOption.decryptionKey(BASE64_KEY)); - assertArrayEquals(BLOB_CONTENT, readBytes); - } - - @Test - public void testBatch() { - RpcBatch batchMock = EasyMock.mock(RpcBatch.class); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - EasyMock.replay(batchMock, storageRpcMock); - initializeService(); - StorageBatch batch = storage.batch(); - assertSame(options, batch.getOptions()); - assertSame(storageRpcMock, batch.getStorageRpc()); - assertSame(batchMock, batch.getBatch()); - EasyMock.verify(batchMock); - } - - @Test - public void testSignUrl() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = storage.signUrl(BLOB_INFO1, 14, TimeUnit.DAYS); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlLeadingSlash() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - String blobName = "/b1"; - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String expectedResourcePath = "/b1"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedResourcePath) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedResourcePath); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlLeadingSlashWithHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - String blobName = "/b1"; - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithOptions() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.POST), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withMd5()); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.POST) - .append('\n') - .append(BLOB_INFO1.getMd5()) - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithOptionsAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.POST), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withMd5(), - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.POST) - .append('\n') - .append(BLOB_INFO1.getMd5()) - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSpecialChars() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - Map encodingCharsToTest = - new HashMap(RFC3986_URI_ENCODING_MAP); - // Signed URL specs say that '/' is not encoded in the resource name (path segment of the URI). - encodingCharsToTest.put('/', "/"); - for (Map.Entry entry : encodingCharsToTest.entrySet()) { - String blobName = "/a" + entry.getKey() + "b"; - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String expectedBlobName = "/a" + entry.getValue() + "b"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - } - - @Test - public void testSignUrlForBlobWithSpecialCharsAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - Map encodingCharsToTest = - new HashMap(RFC3986_URI_ENCODING_MAP); - // Signed URL specs say that '/' is not encoded in the resource name (path segment of the URI). - encodingCharsToTest.put('/', "/"); - for (Map.Entry entry : encodingCharsToTest.entrySet()) { - String blobName = "/a" + entry.getKey() + "b"; - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String expectedBlobName = "/a" + entry.getValue() + "b"; - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(expectedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - } - - @Test - public void testSignUrlWithExtHeaders() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - Map extHeaders = new HashMap(); - extHeaders.put("x-goog-acl", "public-read"); - extHeaders.put("x-goog-meta-owner", "myself"); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.PUT), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withExtHeaders(extHeaders)); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.PUT) - .append('\n') - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append('\n') - .append("x-goog-acl:public-read\n") - .append("x-goog-meta-owner:myself\n") - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlWithExtHeadersAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - Map extHeaders = new HashMap(); - extHeaders.put("x-goog-acl", "public-read"); - extHeaders.put("x-goog-meta-owner", "myself"); - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.httpMethod(HttpMethod.PUT), - Storage.SignUrlOption.withContentType(), - Storage.SignUrlOption.withExtHeaders(extHeaders), - Storage.SignUrlOption.withHostName("https://example.com")); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.PUT) - .append('\n') - .append('\n') - .append(BLOB_INFO1.getContentType()) - .append('\n') - .append(42L + 1209600) - .append('\n') - .append("x-goog-acl:public-read\n") - .append("x-goog-meta-owner:myself\n") - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSlashes() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String blobName = "/foo/bar/baz #%20other cool stuff.txt"; - URL url = - storage.signUrl(BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), 14, TimeUnit.DAYS); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testSignUrlForBlobWithSlashesAndHostName() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String blobName = "/foo/bar/baz #%20other cool stuff.txt"; - URL url = - storage.signUrl( - BlobInfo.newBuilder(BUCKET_NAME1, blobName).build(), - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withHostName("https://example.com")); - String escapedBlobName = Rfc3986UriEncode(blobName, false); - String stringUrl = url.toString(); - String expectedUrl = - new StringBuilder("https://example.com/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName) - .append("?GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedUrl)); - String signature = stringUrl.substring(expectedUrl.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append("\n\n\n") - .append(42L + 1209600) - .append("\n/") - .append(BUCKET_NAME1) - .append("/") - .append(escapedBlobName); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - @Test - public void testV2SignUrlWithQueryParams() - throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, - UnsupportedEncodingException { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String dispositionNotEncoded = "attachment; filename=\"" + BLOB_NAME1 + "\""; - String dispositionEncoded = "attachment%3B%20filename%3D%22" + BLOB_NAME1 + "%22"; - URL url = - storage.signUrl( - BLOB_INFO1, - 14, - TimeUnit.DAYS, - Storage.SignUrlOption.withPathStyle(), - Storage.SignUrlOption.withV2Signature(), - Storage.SignUrlOption.withQueryParams( - ImmutableMap.of( - "response-content-disposition", dispositionNotEncoded))); - - String stringUrl = url.toString(); - - String expectedPrefix = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - // Query params aren't sorted for V2 signatures; user-supplied params are inserted at - // the start of the query string, before the required auth params. - .append("?response-content-disposition=") - .append(dispositionEncoded) - .append("&GoogleAccessId=") - .append(ACCOUNT) - .append("&Expires=") - .append(42L + 1209600) - .append("&Signature=") - .toString(); - assertTrue(stringUrl.startsWith(expectedPrefix)); - String signature = stringUrl.substring(expectedPrefix.length()); - - StringBuilder signedMessageBuilder = new StringBuilder(); - signedMessageBuilder - .append(HttpMethod.GET) - .append('\n') - // No value for Content-MD5, blank - .append('\n') - // No value for Content-Type, blank - .append('\n') - // Expiration line: - .append(42L + 1209600) - .append('\n') - // Resource line: - .append('/') - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1); - - Signature signer = Signature.getInstance("SHA256withRSA"); - signer.initVerify(publicKey); - signer.update(signedMessageBuilder.toString().getBytes(UTF_8)); - assertTrue( - signer.verify(BaseEncoding.base64().decode(URLDecoder.decode(signature, UTF_8.name())))); - } - - // TODO(b/144304815): Remove this test once all conformance tests contain query param test cases. - @Test - public void testV4SignUrlWithQueryParams() { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - String dispositionNotEncoded = "attachment; filename=\"" + BLOB_NAME1 + "\""; - String dispositionEncoded = "attachment%3B%20filename%3D%22" + BLOB_NAME1 + "%22"; - URL url = - storage.signUrl( - BLOB_INFO1, - 6, - TimeUnit.DAYS, - Storage.SignUrlOption.withPathStyle(), - Storage.SignUrlOption.withV4Signature(), - Storage.SignUrlOption.withQueryParams( - ImmutableMap.of( - "response-content-disposition", dispositionNotEncoded))); - String stringUrl = url.toString(); - String expectedPrefix = - new StringBuilder("https://storage.googleapis.com/") - .append(BUCKET_NAME1) - .append('/') - .append(BLOB_NAME1) - .append('?') - .toString(); - assertTrue(stringUrl.startsWith(expectedPrefix)); - String restOfUrl = stringUrl.substring(expectedPrefix.length()); - - Pattern pattern = - Pattern.compile( - // We use the same code to construct the canonical request query string as we do to - // construct the query string used in the final URL, so this query string should also be - // sorted correctly, except for the trailing x-goog-signature param. - new StringBuilder("X-Goog-Algorithm=GOOG4-RSA-SHA256") - .append("&X-Goog-Credential=[^&]+") - .append("&X-Goog-Date=[^&]+") - .append("&X-Goog-Expires=[^&]+") - .append("&X-Goog-SignedHeaders=[^&]+") - .append("&response-content-disposition=[^&]+") - // Signature is always tacked onto the end of the final URL; it's not sorted w/ the - // other params above, since the signature is not known when you're constructing the - // query string line of the canonical request string. - .append("&X-Goog-Signature=.*") - .toString()); - Matcher matcher = pattern.matcher(restOfUrl); - assertTrue(restOfUrl, matcher.matches()); - - // Make sure query param was encoded properly. - assertNotEquals(-1, restOfUrl.indexOf("&response-content-disposition=" + dispositionEncoded)); - } - - @Test - public void testGetAllArray() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.get(blobId1, blobId2); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testGetAllArrayIterable() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addGet( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.get(ImmutableList.of(blobId1, blobId2)); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testDeleteAllArray() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List result = storage.delete(blobId1, blobId2); - callback1.getValue().onSuccess(null); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, result.size()); - assertTrue(result.get(0)); - assertFalse(result.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testDeleteAllIterable() { - BlobId blobId1 = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - BlobId blobId2 = BlobId.of(BUCKET_NAME1, BLOB_NAME2); - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addDelete( - EasyMock.eq(Conversions.json().blobId().encode(blobId2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List result = storage.delete(blobId1, blobId2); - callback1.getValue().onSuccess(null); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, result.size()); - assertTrue(result.get(0)); - assertFalse(result.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testUpdateAllArray() { - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.update(BLOB_INFO1, BLOB_INFO2); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testUpdateAllIterable() { - RpcBatch batchMock = EasyMock.createMock(RpcBatch.class); - Capture> callback1 = Capture.newInstance(); - Capture> callback2 = Capture.newInstance(); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO1)), - EasyMock.capture(callback1), - EasyMock.eq(ImmutableMap.of())); - batchMock.addPatch( - EasyMock.eq(Conversions.json().blobInfo().encode(BLOB_INFO2)), - EasyMock.capture(callback2), - EasyMock.eq(ImmutableMap.of())); - EasyMock.expect(storageRpcMock.createBatch()).andReturn(batchMock); - batchMock.submit(); - EasyMock.replay(storageRpcMock, batchMock); - initializeService(); - List resultBlobs = storage.update(ImmutableList.of(BLOB_INFO1, BLOB_INFO2)); - callback1.getValue().onSuccess(Conversions.json().blobInfo().encode(BLOB_INFO1)); - callback2.getValue().onFailure(new GoogleJsonError()); - assertEquals(2, resultBlobs.size()); - assertEquals(new Blob(storage, new BlobInfo.BuilderImpl(BLOB_INFO1)), resultBlobs.get(0)); - assertNull(resultBlobs.get(1)); - EasyMock.verify(batchMock); - } - - @Test - public void testGetBucketAcl() { - EasyMock.expect( - storageRpcMock.getAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetBucketAclNull() { - EasyMock.expect( - storageRpcMock.getAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteBucketAcl() { - EasyMock.expect( - storageRpcMock.deleteAcl( - BUCKET_NAME1, "allAuthenticatedUsers", new HashMap())) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createAcl( - Conversions.json().bucketAcl().encode(ACL).setBucket(BUCKET_NAME1), - new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchAcl( - Conversions.json().bucketAcl().encode(ACL).setBucket(BUCKET_NAME1), - new HashMap())) - .andReturn(Conversions.json().bucketAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListBucketAcl() { - EasyMock.expect(storageRpcMock.listAcls(BUCKET_NAME1, new HashMap())) - .andReturn( - ImmutableList.of( - Conversions.json().bucketAcl().encode(ACL), - Conversions.json().bucketAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listAcls(BUCKET_NAME1); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.getDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(Conversions.json().objectAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetDefaultBucketAclNull() { - EasyMock.expect(storageRpcMock.getDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.deleteDefaultAcl(BUCKET_NAME1, "allAuthenticatedUsers")) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteDefaultAcl(BUCKET_NAME1, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateDefaultBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createDefaultAcl( - Conversions.json().objectAcl().encode(ACL).setBucket(BUCKET_NAME1))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createDefaultAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateDefaultBucketAcl() { - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchDefaultAcl( - Conversions.json().objectAcl().encode(ACL).setBucket(BUCKET_NAME1))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateDefaultAcl(BUCKET_NAME1, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListDefaultBucketAcl() { - EasyMock.expect(storageRpcMock.listDefaultAcls(BUCKET_NAME1)) - .andReturn( - ImmutableList.of( - Conversions.json().objectAcl().encode(ACL), - Conversions.json().objectAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listDefaultAcls(BUCKET_NAME1); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.getAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(Conversions.json().objectAcl().encode(ACL)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.getAcl(blobId, User.ofAllAuthenticatedUsers()); - assertEquals(ACL, acl); - } - - @Test - public void testGetBlobAclNull() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.getAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(null); - EasyMock.replay(storageRpcMock); - initializeService(); - assertNull(storage.getAcl(blobId, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testDeleteBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect( - storageRpcMock.deleteAcl(BUCKET_NAME1, BLOB_NAME1, 42L, "allAuthenticatedUsers")) - .andReturn(true); - EasyMock.replay(storageRpcMock); - initializeService(); - assertTrue(storage.deleteAcl(blobId, User.ofAllAuthenticatedUsers())); - } - - @Test - public void testCreateBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.createAcl( - Conversions.json() - .objectAcl() - .encode(ACL) - .setBucket(BUCKET_NAME1) - .setObject(BLOB_NAME1) - .setGeneration(42L))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.createAcl(blobId, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testUpdateBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - Acl returnedAcl = ACL.toBuilder().setEtag("ETAG").setId("ID").build(); - EasyMock.expect( - storageRpcMock.patchAcl( - Conversions.json() - .objectAcl() - .encode(ACL) - .setBucket(BUCKET_NAME1) - .setObject(BLOB_NAME1) - .setGeneration(42L))) - .andReturn(Conversions.json().objectAcl().encode(returnedAcl)); - EasyMock.replay(storageRpcMock); - initializeService(); - Acl acl = storage.updateAcl(blobId, ACL); - assertEquals(returnedAcl, acl); - } - - @Test - public void testListBlobAcl() { - BlobId blobId = BlobId.of(BUCKET_NAME1, BLOB_NAME1, 42L); - EasyMock.expect(storageRpcMock.listAcls(BUCKET_NAME1, BLOB_NAME1, 42L)) - .andReturn( - ImmutableList.of( - Conversions.json().objectAcl().encode(ACL), - Conversions.json().objectAcl().encode(OTHER_ACL))); - EasyMock.replay(storageRpcMock); - initializeService(); - List acls = storage.listAcls(blobId); - assertEquals(ImmutableList.of(ACL, OTHER_ACL), acls); - } - - @Test - public void testGetIamPolicy() { - EasyMock.expect(storageRpcMock.getIamPolicy(BUCKET_NAME1, EMPTY_RPC_OPTIONS)) - .andReturn(API_POLICY1); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(LIB_POLICY1, storage.getIamPolicy(BUCKET_NAME1)); - } - - @Test - public void testSetIamPolicy() { - com.google.api.services.storage.model.Policy preCommitApiPolicy = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers( - ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(POLICY_ETAG1) - .setVersion(1); - // postCommitApiPolicy is identical but for the etag, which has been updated. - com.google.api.services.storage.model.Policy postCommitApiPolicy = - new com.google.api.services.storage.model.Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers( - ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(POLICY_ETAG2) - .setVersion(1); - Policy postCommitLibPolicy = - Policy.newBuilder() - .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) - .addIdentity( - StorageRoles.objectAdmin(), - Identity.user("test1@gmail.com"), - Identity.user("test2@gmail.com")) - .addIdentity(StorageRoles.admin(), Identity.group("test-group@gmail.com")) - .setEtag(POLICY_ETAG2) - .setVersion(1) - .build(); - - EasyMock.expect(storageRpcMock.getIamPolicy(BUCKET_NAME1, EMPTY_RPC_OPTIONS)) - .andReturn(API_POLICY1); - EasyMock.expect( - storageRpcMock.setIamPolicy( - EasyMock.eq(BUCKET_NAME1), - eqApiPolicy(preCommitApiPolicy), - EasyMock.eq(EMPTY_RPC_OPTIONS))) - .andReturn(postCommitApiPolicy); - EasyMock.replay(storageRpcMock); - initializeService(); - - Policy currentPolicy = storage.getIamPolicy(BUCKET_NAME1); - Policy updatedPolicy = - storage.setIamPolicy( - BUCKET_NAME1, - currentPolicy - .toBuilder() - .addIdentity(StorageRoles.admin(), Identity.group("test-group@gmail.com")) - .build()); - assertEquals(updatedPolicy, postCommitLibPolicy); - } - - @Test - public void testTestIamPermissionsNull() { - ImmutableList expectedPermissions = ImmutableList.of(false, false, false); - ImmutableList checkedPermissions = - ImmutableList.of( - "storage.buckets.get", "storage.buckets.getIamPolicy", "storage.objects.list"); - - EasyMock.expect( - storageRpcMock.testIamPermissions(BUCKET_NAME1, checkedPermissions, EMPTY_RPC_OPTIONS)) - .andReturn(new TestIamPermissionsResponse()); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(expectedPermissions, storage.testIamPermissions(BUCKET_NAME1, checkedPermissions)); - } - - @Test - public void testTestIamPermissionsNonNull() { - ImmutableList expectedPermissions = ImmutableList.of(true, false, true); - ImmutableList checkedPermissions = - ImmutableList.of( - "storage.buckets.get", "storage.buckets.getIamPolicy", "storage.objects.list"); - - EasyMock.expect( - storageRpcMock.testIamPermissions(BUCKET_NAME1, checkedPermissions, EMPTY_RPC_OPTIONS)) - .andReturn( - new TestIamPermissionsResponse() - .setPermissions(ImmutableList.of("storage.objects.list", "storage.buckets.get"))); - EasyMock.replay(storageRpcMock); - initializeService(); - assertEquals(expectedPermissions, storage.testIamPermissions(BUCKET_NAME1, checkedPermissions)); - } - - @Test - public void testLockRetentionPolicy() { - EasyMock.expect( - storageRpcMock.lockRetentionPolicy( - Conversions.json().bucketInfo().encode(BUCKET_INFO3), - BUCKET_TARGET_OPTIONS_LOCK_RETENTION_POLICY)) - .andReturn(Conversions.json().bucketInfo().encode(BUCKET_INFO3)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = - storage.lockRetentionPolicy( - BUCKET_INFO3, BUCKET_TARGET_METAGENERATION, BUCKET_TARGET_USER_PROJECT); - assertEquals(expectedBucket3, bucket); - } - - @Test - public void testGetServiceAccount() { - EasyMock.expect(storageRpcMock.getServiceAccount("projectId")) - .andReturn(Conversions.json().serviceAccount().encode(SERVICE_ACCOUNT)); - EasyMock.replay(storageRpcMock); - initializeService(); - ServiceAccount serviceAccount = storage.getServiceAccount("projectId"); - assertEquals(SERVICE_ACCOUNT, serviceAccount); - } - - @Test - public void testRetryableException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new StorageException(500, "internalError")) - .andReturn(Conversions.json().blobInfo().encode(BLOB_INFO1)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - initializeServiceDependentObjects(); - Blob readBlob = storage.get(blob); - assertEquals(expectedBlob1, readBlob); - } - - @Test - public void testNonRetryableException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - String exceptionMessage = "Not Implemented"; - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new StorageException(501, exceptionMessage)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - initializeServiceDependentObjects(); - try { - storage.get(blob); - Assert.fail(); - } catch (StorageException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testRuntimeException() { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - String exceptionMessage = "Artificial runtime exception"; - EasyMock.expect(storageRpcMock.get(Conversions.json().blobId().encode(blob), EMPTY_RPC_OPTIONS)) - .andThrow(new RuntimeException(exceptionMessage)); - EasyMock.replay(storageRpcMock); - storage = - options - .toBuilder() - .setRetrySettings(ServiceOptions.getDefaultRetrySettings()) - .build() - .getService(); - try { - storage.get(blob); - Assert.fail(); - } catch (StorageException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testV4PostPolicy() { - EasyMock.replay(storageRpcMock); - ServiceAccountCredentials credentials = - ServiceAccountCredentials.newBuilder() - .setClientEmail(ACCOUNT) - .setPrivateKey(privateKey) - .build(); - storage = options.toBuilder().setCredentials(credentials).build().getService(); - - PostPolicyV4.PostFieldsV4 fields = - PostPolicyV4.PostFieldsV4.newBuilder().setAcl("public-read").build(); - PostPolicyV4.PostConditionsV4 conditions = - PostPolicyV4.PostConditionsV4.newBuilder() - .addContentTypeCondition(PostPolicyV4.ConditionV4Type.MATCHES, "image/jpeg") - .build(); - - // test fields and conditions - PostPolicyV4 policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), - 7, - TimeUnit.DAYS, - fields, - conditions); - - Map outputFields = policy.getFields(); - - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("content-type"), "image/jpeg"); - assertEquals(outputFields.get("acl"), "public-read"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - - // test fields, no conditions - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS, conditions); - outputFields = policy.getFields(); - - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("content-type"), "image/jpeg"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - - // test conditions, no fields - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS, fields); - outputFields = policy.getFields(); - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("acl"), "public-read"); - assertEquals(outputFields.get("key"), "my-object"); - - // test no conditions no fields - policy = - storage.generateSignedPostPolicyV4( - BlobInfo.newBuilder("my-bucket", "my-object").build(), 7, TimeUnit.DAYS); - outputFields = policy.getFields(); - assertTrue(outputFields.containsKey("x-goog-date")); - assertTrue(outputFields.containsKey("x-goog-credential")); - assertTrue(outputFields.containsKey("x-goog-signature")); - assertEquals(outputFields.get("x-goog-algorithm"), "GOOG4-RSA-SHA256"); - assertEquals(outputFields.get("key"), "my-object"); - assertEquals("https://storage.googleapis.com/my-bucket/", policy.getUrl()); - } - - @Test - public void testBucketLifecycleRules() { - BucketInfo bucketInfo = - BucketInfo.newBuilder("b") - .setLocation("us") - .setLifecycleRules( - ImmutableList.of( - new BucketInfo.LifecycleRule( - BucketInfo.LifecycleRule.LifecycleAction.newSetStorageClassAction( - StorageClass.COLDLINE), - BucketInfo.LifecycleRule.LifecycleCondition.newBuilder() - .setAge(1) - .setNumberOfNewerVersions(3) - .setIsLive(false) - .setCreatedBefore(new DateTime(System.currentTimeMillis())) - .setMatchesStorageClass(ImmutableList.of(StorageClass.COLDLINE)) - .setDaysSinceNoncurrentTime(30) - .setNoncurrentTimeBefore(new DateTime(System.currentTimeMillis())) - .setCustomTimeBefore(new DateTime(System.currentTimeMillis())) - .setDaysSinceCustomTime(30) - .build()))) - .build(); - EasyMock.expect( - storageRpcMock.create( - Conversions.json().bucketInfo().encode(bucketInfo), - new HashMap())) - .andReturn(Conversions.json().bucketInfo().encode(bucketInfo)); - EasyMock.replay(storageRpcMock); - initializeService(); - Bucket bucket = storage.create(bucketInfo); - BucketInfo.LifecycleRule lifecycleRule = bucket.getLifecycleRules().get(0); - assertEquals(3, lifecycleRule.getCondition().getNumberOfNewerVersions().intValue()); - assertNotNull(lifecycleRule.getCondition().getCreatedBefore()); - assertFalse(lifecycleRule.getCondition().getIsLive()); - assertEquals(1, lifecycleRule.getCondition().getAge().intValue()); - assertEquals(1, lifecycleRule.getCondition().getMatchesStorageClass().size()); - assertEquals(30, lifecycleRule.getCondition().getDaysSinceNoncurrentTime().intValue()); - assertNotNull(lifecycleRule.getCondition().getNoncurrentTimeBefore()); - assertEquals(30, lifecycleRule.getCondition().getDaysSinceCustomTime().intValue()); - assertNotNull(lifecycleRule.getCondition().getCustomTimeBefore()); - } - - @Test - public void testDownloadTo() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = options.toBuilder().build().getService(); - final byte[] expected = {1, 2}; - EasyMock.expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected); - return 2l; - } - }); - EasyMock.replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - storage.downloadTo(blob, file.toPath()); - byte actual[] = Files.readAllBytes(file.toPath()); - assertArrayEquals(expected, actual); - } - - @Test - public void testDownloadToWithRetries() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = - options - .toBuilder() - .setRetrySettings(RetrySettings.newBuilder().setMaxAttempts(2).build()) - .build() - .getService(); - final byte[] expected = {1, 2}; - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected[0]); - throw new StorageException(504, "error"); - } - }); - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(1l), - anyObject(OutputStream.class))) - .andAnswer( - new IAnswer() { - @Override - public Long answer() throws Throwable { - ((OutputStream) getCurrentArguments()[3]).write(expected[1]); - return 1l; - } - }); - replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - storage.downloadTo(blob, file.toPath()); - byte actual[] = Files.readAllBytes(file.toPath()); - assertArrayEquals(expected, actual); - } - - @Test - public void testDownloadToWithException() throws Exception { - BlobId blob = BlobId.of(BUCKET_NAME1, BLOB_NAME1); - storage = options.toBuilder().build().getService(); - Exception exception = new IllegalStateException("test"); - expect( - storageRpcMock.read( - anyObject(StorageObject.class), - anyObject(Map.class), - eq(0l), - anyObject(OutputStream.class))) - .andThrow(exception); - replay(storageRpcMock); - File file = File.createTempFile("blob", ".tmp"); - try { - storage.downloadTo(blob, file.toPath()); - fail(); - } catch (StorageException e) { - assertSame(exception, e.getCause()); - } - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java deleted file mode 100644 index d120441eda..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageOptionsTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage; - -import static com.google.common.truth.Truth.assertThat; - -import com.google.cloud.TransportOptions; -import org.easymock.EasyMock; -import org.junit.Assert; -import org.junit.Test; - -public class StorageOptionsTest { - - @Test - public void testInvalidTransport() { - try { - StorageOptions.http() - .setTransportOptions(EasyMock.createMock(TransportOptions.class)); - Assert.fail(); - } catch (IllegalArgumentException ex) { - Assert.assertNotNull(ex.getMessage()); - } - } - - @Test - public void testConfigureHostShouldBeKeptOnToBuilder() { - StorageOptions opts1 = StorageOptions.http().setHost("custom-host").build(); - StorageOptions opts2 = opts1.toBuilder().build(); - - assertThat(opts2.getHost()).isEqualTo("custom-host"); - } - - @Test - public void testToBuilderShouldSpecifyDefaultIfNotOtherwiseSet() { - StorageOptions opts1 = StorageOptions.http().build(); - StorageOptions opts2 = opts1.toBuilder().build(); - - assertThat(opts2.getHost()).isEqualTo("https://storage.googleapis.com"); - } - - @Test - public void testNewBuilderSpecifiesCorrectHost() { - StorageOptions opts1 = StorageOptions.http().build(); - - assertThat(opts1.getHost()).isEqualTo("https://storage.googleapis.com"); - } - - @Test - public void testDefaultInstanceSpecifiesCorrectHost() { - StorageOptions opts1 = StorageOptions.getDefaultInstance(); - - assertThat(opts1.getHost()).isEqualTo("https://storage.googleapis.com"); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java index 76219beccd..32d308a311 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/TransportCompatibilityTest.java @@ -38,7 +38,9 @@ public void verifyUnsupportedMethodsGenerateMeaningfulException() { .setCredentials(NoCredentials.getInstance()) .build(); @SuppressWarnings("resource") - Storage s = new GrpcStorageImpl(options, null, null, Opts.empty()); + Storage s = + new GrpcStorageImpl( + options, null, ResponseContentLifecycleManager.noop(), null, Opts.empty()); ImmutableList messages = Stream.>of( s::batch, diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java new file mode 100644 index 0000000000..57d96dfbca --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ZeroCopyMarshallerTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2024 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.google.cloud.storage; + +import static com.google.cloud.storage.TestUtils.getChecksummedData; +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import com.google.cloud.storage.GrpcStorageOptions.ReadObjectResponseZeroCopyMessageMarshaller; +import com.google.common.collect.ImmutableList; +import com.google.common.hash.Hashing; +import com.google.protobuf.ByteString; +import com.google.storage.v2.ContentRange; +import com.google.storage.v2.Object; +import com.google.storage.v2.ObjectChecksums; +import com.google.storage.v2.ReadObjectResponse; +import io.grpc.StatusRuntimeException; +import io.grpc.internal.ReadableBuffer; +import io.grpc.internal.ReadableBuffers; +import java.io.Closeable; +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; +import org.junit.Test; + +public class ZeroCopyMarshallerTest { + private final byte[] bytes = DataGenerator.base64Characters().genBytes(40); + private final ByteString data = ByteString.copyFrom(bytes, 0, 10); + private final ReadObjectResponse response = + ReadObjectResponse.newBuilder() + .setMetadata( + Object.newBuilder() + .setName("name") + .setGeneration(3L) + .setContentType("application/octet-stream") + .build()) + .setContentRange(ContentRange.newBuilder().setStart(0).build()) + .setObjectChecksums( + ObjectChecksums.newBuilder().setCrc32C(Hashing.crc32c().hashBytes(bytes).asInt())) + .setChecksummedData(getChecksummedData(data, Hasher.enabled())) + .build(); + + private ReadObjectResponseZeroCopyMessageMarshaller createMarshaller() { + return new ReadObjectResponseZeroCopyMessageMarshaller(ReadObjectResponse.getDefaultInstance()); + } + + private byte[] dropLastOneByte(byte[] bytes) { + return Arrays.copyOfRange(bytes, 0, bytes.length - 1); + } + + private InputStream createInputStream(byte[] bytes, boolean isZeroCopyable) { + ReadableBuffer buffer = + isZeroCopyable ? ReadableBuffers.wrap(ByteBuffer.wrap(bytes)) : ReadableBuffers.wrap(bytes); + return ReadableBuffers.openStream(buffer, true); + } + + @Test + public void testParseOnFastPath() throws IOException { + InputStream stream = createInputStream(response.toByteArray(), true); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + ReadObjectResponse response = marshaller.parse(stream); + assertEquals(response, this.response); + ResponseContentLifecycleHandle stream2 = marshaller.get(response); + assertNotNull(stream2); + stream2.close(); + ResponseContentLifecycleHandle stream3 = marshaller.get(response); + assertNotNull(stream3); + stream3.close(); + } + + @Test + public void testParseOnSlowPath() throws IOException { + InputStream stream = createInputStream(response.toByteArray(), false); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + ReadObjectResponse response = marshaller.parse(stream); + assertEquals(response, this.response); + ResponseContentLifecycleHandle stream2 = marshaller.get(response); + assertNotNull(stream2); + stream2.close(); + } + + @Test + public void testParseBrokenMessageOnFastPath() { + InputStream stream = createInputStream(dropLastOneByte(response.toByteArray()), true); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + assertThrows( + StatusRuntimeException.class, + () -> { + marshaller.parse(stream); + }); + } + + @Test + public void testParseBrokenMessageOnSlowPath() { + InputStream stream = createInputStream(dropLastOneByte(response.toByteArray()), false); + ReadObjectResponseZeroCopyMessageMarshaller marshaller = createMarshaller(); + assertThrows( + StatusRuntimeException.class, + () -> { + marshaller.parse(stream); + }); + } + + @Test + public void testResponseContentLifecycleHandle() throws IOException { + AtomicBoolean wasClosedCalled = new AtomicBoolean(false); + Closeable verifyClosed = () -> wasClosedCalled.set(true); + + ResponseContentLifecycleHandle handle = + new ResponseContentLifecycleHandle(response, verifyClosed); + handle.close(); + + assertTrue(wasClosedCalled.get()); + + ResponseContentLifecycleHandle nullHandle = new ResponseContentLifecycleHandle(response, null); + nullHandle.close(); + // No NullPointerException means test passes + } + + @Test + public void testMarshallerClose_clean() throws IOException { + CloseAuditingInputStream stream1 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + CloseAuditingInputStream stream2 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + CloseAuditingInputStream stream3 = + CloseAuditingInputStream.of(createInputStream(response.toByteArray(), true)); + + ReadObjectResponseZeroCopyMessageMarshaller.closeAllStreams( + ImmutableList.of(stream1, stream2, stream3)); + + assertThat(stream1.closed).isTrue(); + assertThat(stream2.closed).isTrue(); + assertThat(stream3.closed).isTrue(); + } + + @SuppressWarnings("resource") + @Test + public void testMarshallerClose_multipleIoExceptions() { + CloseAuditingInputStream stream1 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream1"); + } + }; + CloseAuditingInputStream stream2 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream2"); + } + }; + CloseAuditingInputStream stream3 = + new CloseAuditingInputStream(null) { + @Override + void onClose() throws IOException { + throw new IOException("Kaboom stream3"); + } + }; + + IOException ioException = + assertThrows( + IOException.class, + () -> + ReadObjectResponseZeroCopyMessageMarshaller.closeAllStreams( + ImmutableList.of(stream1, stream2, stream3))); + + assertThat(stream1.closed).isTrue(); + assertThat(stream2.closed).isTrue(); + assertThat(stream3.closed).isTrue(); + + assertThat(ioException).hasMessageThat().isEqualTo("Kaboom stream1"); + List messages = + Arrays.stream(ioException.getSuppressed()) + .map(Throwable::getMessage) + .collect(Collectors.toList()); + assertThat(messages).isEqualTo(ImmutableList.of("Kaboom stream2", "Kaboom stream3")); + } + + private static class CloseAuditingInputStream extends FilterInputStream { + + private boolean closed = false; + + private CloseAuditingInputStream(InputStream in) { + super(in); + } + + public static CloseAuditingInputStream of(InputStream in) { + return new CloseAuditingInputStream(in); + } + + @Override + public void close() throws IOException { + closed = true; + onClose(); + super.close(); + } + + void onClose() throws IOException {} + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java index 7617be79f9..8a415fd8f6 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/CtxFunctions.java @@ -136,6 +136,10 @@ static final class Local { static final class Rpc { static final CtxFunction createEmptyBlob = (ctx, c) -> ctx.map(state -> state.with(ctx.getStorage().create(state.getBlobInfo()))); + static final CtxFunction bucketIamPolicy = + (ctx, c) -> + ctx.map( + state -> state.with(ctx.getStorage().getIamPolicy(state.getBucket().getName()))); } static final class ResourceSetup { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java index 8957473484..814729f840 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/ITRetryConformanceTest.java @@ -117,6 +117,7 @@ public void setUp() throws Throwable { public void tearDown() throws Throwable { LOGGER.fine("Running teardown..."); if (ctx != null) { + ctx = ctx.leftMap(s -> nonTestStorage); getReplaceStorageInObjectsFromCtx() .andThen(mapping.getTearDown()) .apply(ctx, testRetryConformance); @@ -166,9 +167,7 @@ public ImmutableList parameters() { .setMappings(new RpcMethodMappings()) .setProjectId("conformance-tests") .setHost(testBench.getBaseUri().replaceAll("https?://", "")) - .setTestAllowFilter( - RetryTestCaseResolver.includeAll() - .and(RetryTestCaseResolver.lift(trc -> trc.getTransport() == Transport.HTTP))) + .setTestAllowFilter(RetryTestCaseResolver.includeAll()) .build(); List retryTestCases; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java index 1c3947adbf..6ecc0068d0 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMapping.java @@ -21,6 +21,7 @@ import static org.junit.Assert.fail; import com.google.cloud.storage.StorageException; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceSetup; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceTeardown; import com.google.cloud.storage.conformance.retry.Functions.CtxFunction; @@ -42,7 +43,6 @@ */ @Immutable final class RpcMethodMapping { - private final int mappingId; private final RpcMethod method; private final Predicate applicable; @@ -107,6 +107,14 @@ public CtxFunction getTest() { if (instructions.contains("return-reset-connection") && code == 0) { matchExpectedCode = true; } + // testbench resetting the connection is turned into an UNAVAILABLE in grpc, which we then + // map to 503. Add graceful handling here, since we can't disambiguate between reset + // connection and 503 from the service. + if (c.getTransport() == Transport.GRPC + && instructions.contains("return-reset-connection") + && code == 503) { + matchExpectedCode = true; + } if (matchExpectedCode) { return ctx; diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java index 9dc246373c..a60b1bb984 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/RpcMethodMappings.java @@ -53,6 +53,7 @@ import com.google.cloud.storage.Storage.SignUrlOption; import com.google.cloud.storage.Storage.UriScheme; import com.google.cloud.storage.StorageRoles; +import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.conformance.retry.CtxFunctions.Local; import com.google.cloud.storage.conformance.retry.CtxFunctions.ResourceSetup; import com.google.cloud.storage.conformance.retry.CtxFunctions.Rpc; @@ -684,6 +685,7 @@ private static void setIamPolicy(ArrayList a) { a.add( RpcMethodMapping.newBuilder(240, buckets.setIamPolicy) .withApplicable(TestRetryConformance::isPreconditionsProvided) + .withSetup(ResourceSetup.defaultSetup.andThen(Rpc.bucketIamPolicy)) .withTest( (ctx, c) -> ctx.map( @@ -693,7 +695,7 @@ private static void setIamPolicy(ArrayList a) { .setIamPolicy( state.getBucket().getName(), Policy.newBuilder() - .setEtag("h??") + .setEtag(state.getPolicy().getEtag()) .setVersion(3) .setBindings( ImmutableList.of( @@ -1607,7 +1609,9 @@ private static void insert(ArrayList a) { .build()); a.add( RpcMethodMapping.newBuilder(54, objects.insert) - .withApplicable(not(TestRetryConformance::isPreconditionsProvided)) + .withApplicable( + not(TestRetryConformance::isPreconditionsProvided) + .and(trc -> trc.getTransport() == Transport.HTTP)) .withSetup(defaultSetup.andThen(Local.blobInfoWithoutGeneration)) .withTest( (ctx, c) -> diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java index 65c0734807..4f1afd83e5 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/conformance/retry/TestRetryConformance.java @@ -27,7 +27,6 @@ import com.google.cloud.storage.DataGenerator; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.common.base.Joiner; -import com.google.common.base.Suppliers; import com.google.common.io.ByteStreams; import com.google.errorprone.annotations.Immutable; import java.io.ByteArrayInputStream; @@ -42,6 +41,7 @@ import java.time.ZoneId; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -153,13 +153,11 @@ final class TestRetryConformance { String.format( "%s_s%03d-%s-m%03d_top1_%s", BASE_ID, scenarioId, instructionsString.toLowerCase(), mappingId, transportTag); + // define a lazy supplier for bytes. this.lazyHelloWorldUtf8Bytes = - Suppliers.memoize( - () -> { - // define a lazy supplier for bytes. - return genBytes(method); - }); - this.helloWorldFilePath = resolvePathForResource(objectName, method); + () -> genBytes(this.method, this.instruction.getInstructionsList()); + this.helloWorldFilePath = + resolvePathForResource(objectName, method, this.instruction.getInstructionsList()); this.serviceAccountCredentials = resolveServiceAccountCredentials(); } @@ -239,13 +237,14 @@ public String toString() { return getTestName(); } - private static Supplier resolvePathForResource(String objectName, Method method) { + private static Supplier resolvePathForResource( + String objectName, Method method, List instructionList) { return () -> { try { File tempFile = File.createTempFile(objectName, ""); tempFile.deleteOnExit(); - byte[] bytes = genBytes(method); + byte[] bytes = genBytes(method, instructionList); try (ByteArrayInputStream in = new ByteArrayInputStream(bytes); FileOutputStream out = new FileOutputStream(tempFile)) { long copy = ByteStreams.copy(in, out); @@ -276,14 +275,19 @@ public String getTopicName() { return topicName; } - private static byte[] genBytes(Method method) { + private static byte[] genBytes(Method method, List instructionsList) { // Not all tests need data for an object, though some tests - resumable upload - needs // more than 8MiB. // We want to avoid allocating 8.1MiB for each test unnecessarily, especially since we // instantiate all permuted test cases. ~1000 * 8.1MiB ~~ > 8GiB. switch (method.getName()) { case "storage.objects.insert": - return DataGenerator.base64Characters().genBytes(_8MiB * 2 + _512KiB); + boolean after8m = instructionsList.stream().anyMatch(s -> s.endsWith("after-8192K")); + if (after8m) { + return DataGenerator.base64Characters().genBytes(_8MiB * 2 + _512KiB); + } else { + return DataGenerator.base64Characters().genBytes(_512KiB); + } case "storage.objects.get": return DataGenerator.base64Characters().genBytes(_512KiB); default: diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java new file mode 100644 index 0000000000..dc02c3fb9b --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionCommonSemanticsTest.java @@ -0,0 +1,223 @@ +/* + * Copyright 2024 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.google.cloud.storage.it; + +import static com.google.cloud.storage.TestUtils.assertAll; +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; +import static org.junit.Assume.assumeTrue; + +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BlobWriteSession; +import com.google.cloud.storage.BlobWriteSessionConfig; +import com.google.cloud.storage.BlobWriteSessionConfigs; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.BufferAllocationStrategy; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartCleanupStrategy; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartMetadataFieldDecorator; +import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.PartNamingStrategy; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.Storage.BlobTargetOption; +import com.google.cloud.storage.Storage.BlobWriteOption; +import com.google.cloud.storage.StorageException; +import com.google.cloud.storage.StorageOptions; +import com.google.cloud.storage.TransportCompatibility.Transport; +import com.google.cloud.storage.it.ITBlobWriteSessionCommonSemanticsTest.ParamsProvider; +import com.google.cloud.storage.it.runner.StorageITRunner; +import com.google.cloud.storage.it.runner.annotations.Backend; +import com.google.cloud.storage.it.runner.annotations.CrossRun; +import com.google.cloud.storage.it.runner.annotations.Inject; +import com.google.cloud.storage.it.runner.annotations.Parameterized; +import com.google.cloud.storage.it.runner.annotations.Parameterized.Parameter; +import com.google.cloud.storage.it.runner.annotations.Parameterized.ParametersProvider; +import com.google.cloud.storage.it.runner.registry.Generator; +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.WritableByteChannel; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; + +@RunWith(StorageITRunner.class) +@CrossRun( + backends = {Backend.PROD}, + transports = {Transport.HTTP, Transport.GRPC}) +@Parameterized(ParamsProvider.class) +public final class ITBlobWriteSessionCommonSemanticsTest { + + @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Inject public Storage injectedStorage; + @Inject public BucketInfo bucket; + @Inject public Generator generator; + + @Parameter public Params params; + + private Storage storage; + + @Before + public void setUp() throws Exception { + Path tmpDir = temporaryFolder.newFolder().toPath(); + BlobWriteSessionConfig config = params.ctor.apply(tmpDir); + + StorageOptions originalOptions = injectedStorage.getOptions(); + StorageOptions newOptions = null; + try { + newOptions = originalOptions.toBuilder().setBlobWriteSessionConfig(config).build(); + } catch (IllegalArgumentException e) { + assertThat(e).hasMessageThat().contains("not compatible with this"); + assumeTrue(false); + } + storage = newOptions.getService(); + } + + @After + public void tearDown() throws Exception { + if (storage != null) { + storage.close(); + } + } + + @Test + public void closingAnOpenedSessionWithoutCallingWriteShouldMakeAnEmptyObject() + throws IOException, ExecutionException, InterruptedException, TimeoutException { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + + WritableByteChannel open = session.open(); + open.close(); + BlobInfo gen1 = session.getResult().get(1, TimeUnit.SECONDS); + + // sometimes testbench will not define `.size = 0`, default it here if we get null + Long size = gen1.getSize(); + if (size == null) { + size = 0L; + } + assertThat(size).isEqualTo(0); + } + + @Test + public void attemptingToUseASessionWhichResultsInFailureShouldThrowAStorageException() { + // attempt to write to a bucket which we have not created + String badBucketName = bucket.getName() + "x"; + BlobInfo info = BlobInfo.newBuilder(badBucketName, generator.randomObjectName()).build(); + + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + StorageException se = + assertThrows( + StorageException.class, + () -> { + WritableByteChannel open = session.open(); + open.close(); + }); + + assertThat(se.getCode()).isEqualTo(404); + } + + @Test + public void callingOpenIsOnlyAllowedOnce() throws Exception { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); + + WritableByteChannel open = session.open(); + IllegalStateException se = assertThrows(IllegalStateException.class, session::open); + + assertAll(() -> assertThat(se.getMessage()).contains("already open")); + } + + @Test + public void getResultErrorsWhenTheSessionErrors() throws Exception { + BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); + byte[] helloWorld = "Hello World".getBytes(StandardCharsets.UTF_8); + storage.create(info, helloWorld, BlobTargetOption.doesNotExist()); + + BlobWriteSession session = + storage.blobWriteSession( + info, + // this precondition will result in failure + BlobWriteOption.doesNotExist()); + + try (WritableByteChannel open = session.open()) { + open.write(ByteBuffer.wrap(helloWorld)); + } catch (StorageException se) { + assertThat(se.getCode()).isEqualTo(412); + } catch (IOException ioe) { + assertThat(ioe).hasCauseThat().isInstanceOf(StorageException.class); + StorageException se = (StorageException) ioe.getCause(); + assertThat(se.getCode()).isEqualTo(412); + } + + ExecutionException resultSe = + assertThrows(ExecutionException.class, () -> session.getResult().get(10, TimeUnit.SECONDS)); + + assertAll( + () -> assertThat(resultSe).hasCauseThat().isInstanceOf(StorageException.class), + () -> assertThat(((StorageException) resultSe.getCause()).getCode()).isEqualTo(412)); + } + + public static final class ParamsProvider implements ParametersProvider { + @Override + public ImmutableList parameters() { + final int _2MiB = 2 * 1024 * 1024; + final int _4MiB = 4 * 1024 * 1024; + return ImmutableList.of( + new Params("default", p -> BlobWriteSessionConfigs.getDefault()), + new Params("c!c.2MiB", p -> BlobWriteSessionConfigs.getDefault().withChunkSize(_2MiB)), + new Params("b!p.1", BlobWriteSessionConfigs::bufferToDiskThenUpload), + new Params("j!p.1", p -> BlobWriteSessionConfigs.journaling(ImmutableList.of(p))), + new Params( + "p!t.c&b.s*&p.4MiB&c.n&m.n", + p -> + BlobWriteSessionConfigs.parallelCompositeUpload() + .withExecutorSupplier(ExecutorSupplier.cachedPool()) + .withPartNamingStrategy(PartNamingStrategy.noPrefix()) + .withBufferAllocationStrategy(BufferAllocationStrategy.simple(_4MiB)) + .withPartCleanupStrategy(PartCleanupStrategy.never()) + .withPartMetadataFieldDecorator(PartMetadataFieldDecorator.noOp())), + new Params("d!c.2MiB", p -> BlobWriteSessionConfigs.bidiWrite().withBufferSize(_2MiB))); + } + } + + public interface ParamsCtor { + BlobWriteSessionConfig apply(Path p) throws IOException; + } + + public static final class Params { + private final String desc; + private final ParamsCtor ctor; + + public Params(String desc, ParamsCtor ctor) { + this.desc = desc; + this.ctor = ctor; + } + + @Override + public String toString() { + return desc; + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java index 763346b1f8..10ae174a35 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBlobWriteSessionTest.java @@ -17,7 +17,6 @@ package com.google.cloud.storage.it; import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; import com.google.cloud.storage.BlobInfo; @@ -25,10 +24,10 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; +import com.google.cloud.storage.HttpStorageOptions; +import com.google.cloud.storage.JournalingBlobWriteSessionConfig; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; -import com.google.cloud.storage.StorageException; import com.google.cloud.storage.StorageOptions; import com.google.cloud.storage.TransportCompatibility.Transport; import com.google.cloud.storage.it.runner.StorageITRunner; @@ -36,12 +35,11 @@ import com.google.cloud.storage.it.runner.annotations.CrossRun; import com.google.cloud.storage.it.runner.annotations.Inject; import com.google.cloud.storage.it.runner.registry.Generator; -import java.io.IOException; +import com.google.common.collect.ImmutableList; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; -import java.util.concurrent.ExecutionException; +import java.nio.file.Path; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -49,14 +47,13 @@ @RunWith(StorageITRunner.class) @CrossRun( - transports = {Transport.GRPC}, + transports = {Transport.HTTP, Transport.GRPC}, backends = {Backend.PROD}) public final class ITBlobWriteSessionTest { @Rule public final TemporaryFolder temporaryFolder = new TemporaryFolder(); @Inject public Storage storage; - @Inject public Transport transport; @Inject public BucketInfo bucket; @@ -69,82 +66,61 @@ public void allDefaults() throws Exception { @Test public void bufferToTempDirThenUpload() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToTempDirThenUpload()) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - //noinspection DataFlowIssue + Path path = temporaryFolder.newFolder().toPath(); + StorageOptions options = + storage + .getOptions() + .toBuilder() + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bufferToDiskThenUpload(path)) + .build(); try (Storage s = options.getService()) { doTest(s); } } + @Test + @CrossRun.Exclude(transports = Transport.GRPC) + public void journalingNotSupportedByHttp() { + HttpStorageOptions.Builder builder = ((HttpStorageOptions) storage.getOptions()).toBuilder(); + + Path rootPath = temporaryFolder.getRoot().toPath(); + JournalingBlobWriteSessionConfig journaling = + BlobWriteSessionConfigs.journaling(ImmutableList.of(rootPath)); + + IllegalArgumentException iae = + assertThrows( + IllegalArgumentException.class, () -> builder.setBlobWriteSessionConfig(journaling)); + + assertThat(iae).hasMessageThat().contains("HTTP transport"); + } + @Test public void overrideDefaultBufferSize() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig( - BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - //noinspection DataFlowIssue + StorageOptions options = + (storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig( + BlobWriteSessionConfigs.getDefault().withChunkSize(256 * 1024)) + .build(); + try (Storage s = options.getService()) { doTest(s); } } @Test + @CrossRun.Exclude(transports = Transport.HTTP) public void bidiTest() throws Exception { - StorageOptions options = null; - if (transport == Transport.GRPC) { - options = - ((GrpcStorageOptions) storage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) - .build(); - } - assertWithMessage("unable to resolve options").that(options).isNotNull(); - + StorageOptions options = + (storage.getOptions()) + .toBuilder() + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) + .build(); try (Storage s = options.getService()) { doTest(s); } } - @Test - public void closingAnOpenedSessionWithoutCallingWriteShouldMakeAnEmptyObject() - throws IOException, ExecutionException, InterruptedException, TimeoutException { - BlobInfo info = BlobInfo.newBuilder(bucket, generator.randomObjectName()).build(); - BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); - - WritableByteChannel open = session.open(); - open.close(); - BlobInfo gen1 = session.getResult().get(1, TimeUnit.SECONDS); - - assertThat(gen1.getSize()).isEqualTo(0); - } - - @Test - public void attemptingToOpenASessionWhichResultsInFailureShouldThrowAStorageException() { - // attempt to write to a bucket which we have not created - String badBucketName = bucket.getName() + "x"; - BlobInfo info = BlobInfo.newBuilder(badBucketName, generator.randomObjectName()).build(); - - BlobWriteSession session = storage.blobWriteSession(info, BlobWriteOption.doesNotExist()); - StorageException se = assertThrows(StorageException.class, () -> session.open().close()); - - assertThat(se.getCode()).isEqualTo(404); - assertThat(se).hasMessageThat().contains(badBucketName); - } - private void doTest(Storage underTest) throws Exception { BlobWriteSession sess = underTest.blobWriteSession( diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java index 4526a09f69..70e369f307 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITJournalingBlobWriteSessionConfigTest.java @@ -24,7 +24,6 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; import com.google.cloud.storage.JournalingBlobWriteSessionConfig; import com.google.cloud.storage.Storage; import com.google.cloud.storage.Storage.BlobWriteOption; @@ -75,7 +74,9 @@ public void setUp() throws Exception { JournalingBlobWriteSessionConfig journaling = BlobWriteSessionConfigs.journaling(ImmutableList.of(tempDir)); journalingStorage = - ((GrpcStorageOptions.Builder) this.storage.getOptions().toBuilder()) + this.storage + .getOptions() + .toBuilder() .setBlobWriteSessionConfig(journaling) .build() .getService(); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java index 304cdd69f8..9b7d630f6b 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITParallelCompositeUploadBlobWriteSessionConfigTest.java @@ -18,7 +18,6 @@ import static com.google.cloud.storage.TestUtils.xxd; import static com.google.common.truth.Truth.assertThat; -import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.assertThrows; import com.google.api.gax.paging.Page; @@ -30,7 +29,6 @@ import com.google.cloud.storage.BlobWriteSessionConfigs; import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.DataGenerator; -import com.google.cloud.storage.GrpcStorageOptions; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.BufferAllocationStrategy; import com.google.cloud.storage.ParallelCompositeUploadBlobWriteSessionConfig.ExecutorSupplier; @@ -73,7 +71,7 @@ @RunWith(StorageITRunner.class) @CrossRun( - transports = {Transport.GRPC}, + transports = {Transport.HTTP, Transport.GRPC}, backends = {Backend.PROD}) public final class ITParallelCompositeUploadBlobWriteSessionConfigTest { @@ -118,16 +116,8 @@ public void setUp() throws Exception { // let our fixtures take care of cleaning things .withPartCleanupStrategy(PartCleanupStrategy.never()); - StorageOptions storageOptions = null; - if (transport == Transport.GRPC) { - storageOptions = - ((GrpcStorageOptions) injectedStorage.getOptions()) - .toBuilder() - .setBlobWriteSessionConfig(pcu) - .build(); - } - assertWithMessage("unable to resolve options").that(storageOptions).isNotNull(); - //noinspection DataFlowIssue + StorageOptions storageOptions = + injectedStorage.getOptions().toBuilder().setBlobWriteSessionConfig(pcu).build(); storage = storageOptions.getService(); rand = new Random(); } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java index 7416109be2..5c1feed6f4 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITTransferManagerTest.java @@ -74,6 +74,8 @@ public class ITTransferManagerTest { private static final Comparator comp2 = Comparator.comparing(DownloadResult::getInput, comp); + private static final long CHUNK_THRESHOLD = 2L * 1024 * 1024; + @Inject public Storage storage; @Inject public BucketInfo bucket; @Inject public Generator generator; @@ -106,8 +108,8 @@ public void setUp() throws Exception { writeChannel.write(content); } } - long size = 2L * 1024 * 1024; - size = size + 100L; + // We make this size just a bit bigger than the threshold. + long size = CHUNK_THRESHOLD + 100L; ByteBuffer chunkedContent = DataGenerator.base64Characters().genByteBuffer(size); try (WriteChannel writeChannel = storage.writer(blobInfoChunking)) { writeChannel.write(chunkedContent); @@ -303,7 +305,7 @@ public void downloadBlobsAllowChunked() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { @@ -341,6 +343,56 @@ public void downloadBlobsAllowChunked() throws Exception { } } + @Test + public void uploadFilesAllowPCU() throws Exception { + TransferManagerConfig config = + TransferManagerConfigTestingInstances.defaults(storage.getOptions()) + .toBuilder() + .setAllowParallelCompositeUpload(true) + .setPerWorkerBufferSize(128 * 1024) + .build(); + long size = CHUNK_THRESHOLD + 100L; + try (TransferManager transferManager = config.getService(); + TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, size)) { + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucket.getName()).build(); + UploadJob job = + transferManager.uploadFiles( + Collections.singletonList(tmpFile.getPath()), parallelUploadConfig); + List uploadResults = job.getUploadResults(); + assertThat(uploadResults.get(0).getStatus()).isEqualTo(TransferStatus.SUCCESS); + } + } + + @Test + public void uploadFilesAllowMultiplePCUAndSmallerFiles() throws Exception { + TransferManagerConfig config = + TransferManagerConfigTestingInstances.defaults(storage.getOptions()) + .toBuilder() + .setAllowParallelCompositeUpload(true) + .setPerWorkerBufferSize(128 * 1024) + .build(); + long largeFileSize = CHUNK_THRESHOLD + 100L; + long smallFileSize = CHUNK_THRESHOLD - 100L; + try (TransferManager transferManager = config.getService(); + TmpFile tmpFile = DataGenerator.base64Characters().tempFile(baseDir, largeFileSize); + TmpFile tmpfile2 = DataGenerator.base64Characters().tempFile(baseDir, largeFileSize); + TmpFile tmpFile3 = DataGenerator.base64Characters().tempFile(baseDir, smallFileSize)) { + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucket.getName()).build(); + List files = + ImmutableList.of(tmpFile.getPath(), tmpfile2.getPath(), tmpFile3.getPath()); + UploadJob job = transferManager.uploadFiles(files, parallelUploadConfig); + List uploadResults = job.getUploadResults(); + assertThat(uploadResults).hasSize(3); + assertThat( + uploadResults.stream() + .filter(result -> result.getStatus() == TransferStatus.SUCCESS) + .collect(Collectors.toList())) + .hasSize(3); + } + } + @Test public void downloadNonexistentBucket() throws Exception { TransferManagerConfig config = @@ -367,7 +419,7 @@ public void downloadBlobsChunkedFail() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { @@ -393,7 +445,7 @@ public void downloadBlobsPreconditionFailure() throws Exception { TransferManagerConfig config = TransferManagerConfigTestingInstances.defaults(storage.getOptions()) .toBuilder() - .setAllowDivideAndConquer(true) + .setAllowDivideAndConquerDownload(true) .setPerWorkerBufferSize(128 * 1024) .build(); try (TransferManager transferManager = config.getService()) { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java deleted file mode 100644 index 6f09649aeb..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcher.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage.testing; - -import com.google.api.services.storage.model.Policy; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.common.collect.ImmutableSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.easymock.EasyMock; -import org.easymock.IArgumentMatcher; - -/** - * Matches two {@link Policy} instances, which may have lists of {@link Bindings} that are not in - * the same order but which are still logically equivalent. - */ -public class ApiPolicyMatcher implements IArgumentMatcher { - - private final Map> expectedBindings; - private final String expectedEtag; - - public ApiPolicyMatcher(Policy expected) { - expectedBindings = toMap(expected.getBindings()); - expectedEtag = expected.getEtag(); - } - - @Override - public boolean matches(Object object) { - if (!(object instanceof Policy)) { - return false; - } - Policy actual = (Policy) object; - Map> actualBindings = toMap(actual.getBindings()); - String actualEtag = actual.getEtag(); - - if (expectedEtag == null) { - if (actualEtag != null) { - return false; - } - } else { - if (!expectedEtag.equals(actual.getEtag())) { - return false; - } - } - - if (expectedBindings.size() != actualBindings.size()) { - return false; - } - - for (Map.Entry> entry : expectedBindings.entrySet()) { - String role = entry.getKey(); - Set expectedMembers = entry.getValue(); - Set actualMembers = actualBindings.get(role); - if (!expectedMembers.equals(actualMembers)) { - return false; - } - } - - return true; - } - - @Override - public void appendTo(StringBuffer buffer) { - buffer.append("eqApiPolicy("); - buffer.append("etag="); - buffer.append(expectedEtag); - buffer.append(",bindings="); - buffer.append(expectedBindings); - buffer.append(")"); - } - - public static Policy eqApiPolicy(Policy in) { - EasyMock.reportMatcher(new ApiPolicyMatcher(in)); - return null; - } - - private Map> toMap(List bindings) { - Map> mapBindings = new HashMap<>(); - if (bindings != null) { - for (Bindings binding : bindings) { - mapBindings.put(binding.getRole(), ImmutableSet.copyOf(binding.getMembers())); - } - } - return mapBindings; - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java deleted file mode 100644 index 1514c68d7c..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/ApiPolicyMatcherTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright 2017 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.google.cloud.storage.testing; - -import static com.google.cloud.storage.testing.ApiPolicyMatcher.eqApiPolicy; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import com.google.api.services.storage.model.Policy; -import com.google.api.services.storage.model.Policy.Bindings; -import com.google.common.collect.ImmutableList; -import org.easymock.EasyMock; -import org.junit.Test; - -public class ApiPolicyMatcherTest { - - private static interface PolicyAcceptor { - - int accept(Policy policy); - } - - private static final String ETAG = "CAE="; - private static final Policy API_POLICY_1 = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test1@gmail.com", "user:test2@gmail.com")) - .setRole("roles/storage.objectAdmin"), - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"))) - .setEtag(ETAG); - private static final Policy API_POLICY_2 = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"), - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test2@gmail.com", "user:test1@gmail.com")) - .setRole("roles/storage.objectAdmin"))) - .setEtag(ETAG); - private static final Policy API_POLICY_MISSING_BINDINGS = new Policy().setEtag(ETAG); - private static final Policy API_POLICY_MISSING_ETAG = - new Policy() - .setBindings( - ImmutableList.of( - new Bindings() - .setMembers(ImmutableList.of("group:test-group@gmail.com")) - .setRole("roles/storage.admin"), - new Bindings() - .setMembers(ImmutableList.of("allUsers")) - .setRole("roles/storage.objectViewer"), - new Bindings() - .setMembers(ImmutableList.of("user:test2@gmail.com", "user:test1@gmail.com")) - .setRole("roles/storage.objectAdmin"))); - - @Test - public void testEquivalence() { - assertMatch(API_POLICY_1, API_POLICY_2); - assertMatch(API_POLICY_2, API_POLICY_1); - assertNoMatch(API_POLICY_1, API_POLICY_MISSING_BINDINGS); - assertNoMatch(API_POLICY_MISSING_BINDINGS, API_POLICY_1); - assertNoMatch(API_POLICY_1, API_POLICY_MISSING_ETAG); - assertNoMatch(API_POLICY_MISSING_ETAG, API_POLICY_1); - assertNoMatch(API_POLICY_MISSING_BINDINGS, API_POLICY_MISSING_ETAG); - assertNoMatch(API_POLICY_MISSING_ETAG, API_POLICY_MISSING_BINDINGS); - } - - private static void assertMatch(Policy expected, Policy actual) { - assertTrue(new ApiPolicyMatcher(expected).matches(actual)); - } - - private static void assertNoMatch(Policy expected, Policy actual) { - assertFalse(new ApiPolicyMatcher(expected).matches(actual)); - } - - @Test - public void testStaticMocker() { - PolicyAcceptor mock = EasyMock.createMock(PolicyAcceptor.class); - EasyMock.expect(mock.accept(eqApiPolicy(API_POLICY_1))).andReturn(0); - EasyMock.replay(mock); - mock.accept(API_POLICY_2); - EasyMock.verify(mock); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java deleted file mode 100644 index 44cb82c080..0000000000 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/testing/RemoteStorageHelperTest.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Copyright 2015 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.google.cloud.storage.testing; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import com.google.api.gax.paging.Page; -import com.google.cloud.http.HttpTransportOptions; -import com.google.cloud.storage.Blob; -import com.google.cloud.storage.BlobId; -import com.google.cloud.storage.Storage; -import com.google.cloud.storage.Storage.BlobListOption; -import com.google.cloud.storage.StorageException; -import com.google.cloud.storage.StorageOptions; -import com.google.common.collect.ImmutableList; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import org.easymock.EasyMock; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.threeten.bp.Duration; - -public class RemoteStorageHelperTest { - - private static final String BUCKET_NAME = "bucket-name"; - private static final String PROJECT_ID = "project-id"; - private static final String JSON_KEY = - "{\n" - + " \"private_key_id\": \"somekeyid\",\n" - + " \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggS" - + "kAgEAAoIBAQC+K2hSuFpAdrJI\\nnCgcDz2M7t7bjdlsadsasad+fvRSW6TjNQZ3p5LLQY1kSZRqBqylRkzteMOyHg" - + "aR\\n0Pmxh3ILCND5men43j3h4eDbrhQBuxfEMalkG92sL+PNQSETY2tnvXryOvmBRwa/\\nQP/9dJfIkIDJ9Fw9N4" - + "Bhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nknddadwkwewcVxHFhcZJO+XWf6ofLUXpRwiTZakGMn8EE1uVa2" - + "LgczOjwWHGi99MFjxSer5m9\\n1tCa3/KEGKiS/YL71JvjwX3mb+cewlkcmweBKZHM2JPTk0ZednFSpVZMtycjkbLa" - + "\\ndYOS8V85AgMBewECggEBAKksaldajfDZDV6nGqbFjMiizAKJolr/M3OQw16K6o3/\\n0S31xIe3sSlgW0+UbYlF" - + "4U8KifhManD1apVSC3csafaspP4RZUHFhtBywLO9pR5c\\nr6S5aLp+gPWFyIp1pfXbWGvc5VY/v9x7ya1VEa6rXvL" - + "sKupSeWAW4tMj3eo/64ge\\nsdaceaLYw52KeBYiT6+vpsnYrEkAHO1fF/LavbLLOFJmFTMxmsNaG0tuiJHgjshB\\" - + "n82DpMCbXG9YcCgI/DbzuIjsdj2JC1cascSP//3PmefWysucBQe7Jryb6NQtASmnv\\nCdDw/0jmZTEjpe4S1lxfHp" - + "lAhHFtdgYTvyYtaLZiVVkCgYEA8eVpof2rceecw/I6\\n5ng1q3Hl2usdWV/4mZMvR0fOemacLLfocX6IYxT1zA1FF" - + "JlbXSRsJMf/Qq39mOR2\\nSpW+hr4jCoHeRVYLgsbggtrevGmILAlNoqCMpGZ6vDmJpq6ECV9olliDvpPgWOP+\\nm" - + "YPDreFBGxWvQrADNbRt2dmGsrsCgYEAyUHqB2wvJHFqdmeBsaacewzV8x9WgmeX\\ngUIi9REwXlGDW0Mz50dxpxcK" - + "CAYn65+7TCnY5O/jmL0VRxU1J2mSWyWTo1C+17L0\\n3fUqjxL1pkefwecxwecvC+gFFYdJ4CQ/MHHXU81Lwl1iWdF" - + "Cd2UoGddYaOF+KNeM\\nHC7cmqra+JsCgYEAlUNywzq8nUg7282E+uICfCB0LfwejuymR93CtsFgb7cRd6ak\\nECR" - + "8FGfCpH8ruWJINllbQfcHVCX47ndLZwqv3oVFKh6pAS/vVI4dpOepP8++7y1u\\ncoOvtreXCX6XqfrWDtKIvv0vjl" - + "HBhhhp6mCcRpdQjV38H7JsyJ7lih/oNjECgYAt\\nkndj5uNl5SiuVxHFhcZJO+XWf6ofLUregtevZakGMn8EE1uVa" - + "2AY7eafmoU/nZPT\\n00YB0TBATdCbn/nBSuKDESkhSg9s2GEKQZG5hBmL5uCMfo09z3SfxZIhJdlerreP\\nJ7gSi" - + "dI12N+EZxYd4xIJh/HFDgp7RRO87f+WJkofMQKBgGTnClK1VMaCRbJZPriw\\nEfeFCoOX75MxKwXs6xgrw4W//AYG" - + "GUjDt83lD6AZP6tws7gJ2IwY/qP7+lyhjEqN\\nHtfPZRGFkGZsdaksdlaksd323423d+15/UvrlRSFPNj1tWQmNKk" - + "XyRDW4IG1Oa2p\\nrALStNBx5Y9t0/LQnFI4w3aG\\n-----END PRIVATE KEY-----\\n\",\n" - + " \"client_email\": \"someclientid@developer.gserviceaccount.com\",\n" - + " \"client_id\": \"someclientid.apps.googleusercontent.com\",\n" - + " \"type\": \"service_account\"\n" - + "}"; - private static final InputStream JSON_KEY_STREAM = new ByteArrayInputStream(JSON_KEY.getBytes()); - private static final StorageException RETRYABLE_EXCEPTION = new StorageException(409, ""); - private static final StorageException FATAL_EXCEPTION = new StorageException(500, ""); - private static final String BLOB_NAME2 = "n2"; - private static final BlobId BLOB_ID1 = BlobId.of(BUCKET_NAME, "n1"); - private static final BlobId BLOB_ID2 = BlobId.of(BUCKET_NAME, BLOB_NAME2); - - private Blob blob1; - private Blob blob2; - private List blobList; - private Page blobPage; - - @Before - public void setUp() { - blob1 = EasyMock.createMock(Blob.class); - blob2 = EasyMock.createMock(Blob.class); - blobList = ImmutableList.of(blob1, blob2); - blobPage = - new Page() { - - @Override - public boolean hasNextPage() { - return true; - } - - @Override - public String getNextPageToken() { - return "nextPageCursor"; - } - - @Override - public Page getNextPage() { - return null; - } - - @Override - public Iterable getValues() { - return blobList; - } - - @Override - public Iterable iterateAll() { - return blobList; - } - }; - } - - @Test - public void testForceDelete() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - assertTrue(RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS)); - EasyMock.verify(storageMock, blob1, blob2); - } - - @Test - public void testForceDeleteTimeout() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1).anyTimes(); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2).anyTimes(); - - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage) - .anyTimes(); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(RETRYABLE_EXCEPTION).anyTimes(); - EasyMock.replay(storageMock, blob1, blob2); - assertFalse( - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 50, TimeUnit.MICROSECONDS)); - EasyMock.verify(storageMock); - } - - @Test - public void testForceDeleteFail() throws InterruptedException, ExecutionException { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(FATAL_EXCEPTION); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS); - Assert.fail(); - } catch (ExecutionException ex) { - assertNotNull(ex.getMessage()); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testForceDeleteNoTimeout() { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME); - EasyMock.verify(storageMock); - } - - @Test - public void testForceDeleteNoTimeoutFail() { - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)).andReturn(Collections.nCopies(2, true)).anyTimes(); - EasyMock.expect(storageMock.list(BUCKET_NAME, BlobListOption.versions(true))) - .andReturn(blobPage); - EasyMock.expect(storageMock.delete(BUCKET_NAME)).andThrow(FATAL_EXCEPTION); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME); - Assert.fail(); - } catch (StorageException ex) { - assertNotNull(ex.getMessage()); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testForceDeleteRetriesWithUserProject() throws Exception { - final String USER_PROJECT = "user-project"; - Storage storageMock = EasyMock.createMock(Storage.class); - EasyMock.expect(blob1.getBlobId()).andReturn(BLOB_ID1); - EasyMock.expect(blob2.getBlobId()).andReturn(BLOB_ID2); - EasyMock.expect(blob2.getName()).andReturn(BLOB_NAME2); - ArrayList ids = new ArrayList<>(); - ids.add(BLOB_ID1); - ids.add(BLOB_ID2); - EasyMock.expect(storageMock.delete(ids)) - .andReturn(ImmutableList.of(Boolean.TRUE, Boolean.FALSE)) - .anyTimes(); - EasyMock.expect( - storageMock.delete( - BUCKET_NAME, BLOB_NAME2, Storage.BlobSourceOption.userProject(USER_PROJECT))) - .andReturn(true) - .anyTimes(); - EasyMock.expect( - storageMock.list( - BUCKET_NAME, - BlobListOption.versions(true), - BlobListOption.userProject(USER_PROJECT))) - .andReturn(blobPage); - EasyMock.expect( - storageMock.delete(BUCKET_NAME, Storage.BucketSourceOption.userProject(USER_PROJECT))) - .andReturn(true); - EasyMock.replay(storageMock, blob1, blob2); - try { - RemoteStorageHelper.forceDelete(storageMock, BUCKET_NAME, 5, TimeUnit.SECONDS, USER_PROJECT); - } finally { - EasyMock.verify(storageMock); - } - } - - @Test - public void testCreateFromStream() { - RemoteStorageHelper helper = RemoteStorageHelper.create(PROJECT_ID, JSON_KEY_STREAM); - StorageOptions options = helper.getOptions(); - assertEquals(PROJECT_ID, options.getProjectId()); - assertEquals(60000, ((HttpTransportOptions) options.getTransportOptions()).getConnectTimeout()); - assertEquals(60000, ((HttpTransportOptions) options.getTransportOptions()).getReadTimeout()); - assertEquals(10, options.getRetrySettings().getMaxAttempts()); - assertEquals(Duration.ofMillis(30000), options.getRetrySettings().getMaxRetryDelay()); - assertEquals(Duration.ofMillis(120000), options.getRetrySettings().getTotalTimeout()); - assertEquals(Duration.ofMillis(250), options.getRetrySettings().getInitialRetryDelay()); - } -} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java index 1c5e67b9bf..da89ada5ae 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/transfermanager/TransferManagerConfigTestingInstances.java @@ -27,10 +27,9 @@ public static TransferManagerConfig defaults() { public static TransferManagerConfig defaults(StorageOptions options) { return TransferManagerConfig.newBuilder() - .setAllowDivideAndConquer(false) - .setMaxWorkers(1) + .setAllowDivideAndConquerDownload(false) + .setMaxWorkers(5) .setPerWorkerBufferSize(512 * 1024) - .setQos(DefaultQos.of(2 * 1024 * 1024)) .setStorageOptions(options) .build(); } diff --git a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile index 2c621adeed..a18e9da047 100644 --- a/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile +++ b/google-cloud-storage/src/test/resources/com/google/cloud/storage/it/runner/registry/Dockerfile @@ -1 +1 @@ -FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.42.0 +FROM gcr.io/cloud-devrel-public-resources/storage-testbench:v0.44.0 diff --git a/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml b/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml new file mode 100644 index 0000000000..255b634844 --- /dev/null +++ b/grpc-google-cloud-storage-control-v2/clirr-ignored-differences.xml @@ -0,0 +1,41 @@ + + + + + + + 7012 + com/google/storage/control/v2/* + * deleteManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * createManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * getManagedFolder(*) + + + 7012 + com/google/storage/control/v2/* + * listManagedFolders(*) + + \ No newline at end of file diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 732ba90c5c..14a1ad299f 100644 --- a/grpc-google-cloud-storage-control-v2/pom.xml +++ b/grpc-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java b/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java index 638138a560..476945a178 100644 --- a/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java +++ b/grpc-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlGrpc.java @@ -298,6 +298,193 @@ private StorageControlGrpc() {} return getGetStorageLayoutMethod; } + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "CreateManagedFolder", + requestType = com.google.storage.control.v2.CreateManagedFolderRequest.class, + responseType = com.google.storage.control.v2.ManagedFolder.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getCreateManagedFolderMethod; + if ((getCreateManagedFolderMethod = StorageControlGrpc.getCreateManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getCreateManagedFolderMethod = StorageControlGrpc.getCreateManagedFolderMethod) + == null) { + StorageControlGrpc.getCreateManagedFolderMethod = + getCreateManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName( + generateFullMethodName(SERVICE_NAME, "CreateManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.CreateManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ManagedFolder.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("CreateManagedFolder")) + .build(); + } + } + } + return getCreateManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "DeleteManagedFolder", + requestType = com.google.storage.control.v2.DeleteManagedFolderRequest.class, + responseType = com.google.protobuf.Empty.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.DeleteManagedFolderRequest, com.google.protobuf.Empty> + getDeleteManagedFolderMethod; + if ((getDeleteManagedFolderMethod = StorageControlGrpc.getDeleteManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getDeleteManagedFolderMethod = StorageControlGrpc.getDeleteManagedFolderMethod) + == null) { + StorageControlGrpc.getDeleteManagedFolderMethod = + getDeleteManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName( + generateFullMethodName(SERVICE_NAME, "DeleteManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.DeleteManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.protobuf.Empty.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("DeleteManagedFolder")) + .build(); + } + } + } + return getDeleteManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "GetManagedFolder", + requestType = com.google.storage.control.v2.GetManagedFolderRequest.class, + responseType = com.google.storage.control.v2.ManagedFolder.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder> + getGetManagedFolderMethod; + if ((getGetManagedFolderMethod = StorageControlGrpc.getGetManagedFolderMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getGetManagedFolderMethod = StorageControlGrpc.getGetManagedFolderMethod) == null) { + StorageControlGrpc.getGetManagedFolderMethod = + getGetManagedFolderMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "GetManagedFolder")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.GetManagedFolderRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ManagedFolder.getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("GetManagedFolder")) + .build(); + } + } + } + return getGetManagedFolderMethod; + } + + private static volatile io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "ListManagedFolders", + requestType = com.google.storage.control.v2.ListManagedFoldersRequest.class, + responseType = com.google.storage.control.v2.ListManagedFoldersResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.UNARY) + public static io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod() { + io.grpc.MethodDescriptor< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse> + getListManagedFoldersMethod; + if ((getListManagedFoldersMethod = StorageControlGrpc.getListManagedFoldersMethod) == null) { + synchronized (StorageControlGrpc.class) { + if ((getListManagedFoldersMethod = StorageControlGrpc.getListManagedFoldersMethod) + == null) { + StorageControlGrpc.getListManagedFoldersMethod = + getListManagedFoldersMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.UNARY) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "ListManagedFolders")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ListManagedFoldersRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.storage.control.v2.ListManagedFoldersResponse + .getDefaultInstance())) + .setSchemaDescriptor( + new StorageControlMethodDescriptorSupplier("ListManagedFolders")) + .build(); + } + } + } + return getListManagedFoldersMethod; + } + /** Creates a new async stub that supports all call types for the service */ public static StorageControlStub newStub(io.grpc.Channel channel) { io.grpc.stub.AbstractStub.StubFactory factory = @@ -433,6 +620,63 @@ default void getStorageLayout( io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( getGetStorageLayoutMethod(), responseObserver); } + + /** + * + * + *

        +     * Creates a new managed folder.
        +     * 
        + */ + default void createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getCreateManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + default void deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getDeleteManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + default void getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getGetManagedFolderMethod(), responseObserver); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + default void listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request, + io.grpc.stub.StreamObserver + responseObserver) { + io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall( + getListManagedFoldersMethod(), responseObserver); + } } /** @@ -565,6 +809,71 @@ public void getStorageLayout( request, responseObserver); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public void createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getCreateManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public void deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getDeleteManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public void getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request, + io.grpc.stub.StreamObserver responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getGetManagedFolderMethod(), getCallOptions()), + request, + responseObserver); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public void listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request, + io.grpc.stub.StreamObserver + responseObserver) { + io.grpc.stub.ClientCalls.asyncUnaryCall( + getChannel().newCall(getListManagedFoldersMethod(), getCallOptions()), + request, + responseObserver); + } } /** @@ -665,6 +974,58 @@ public com.google.storage.control.v2.StorageLayout getStorageLayout( return io.grpc.stub.ClientCalls.blockingUnaryCall( getChannel(), getGetStorageLayoutMethod(), getCallOptions(), request); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public com.google.storage.control.v2.ManagedFolder createManagedFolder( + com.google.storage.control.v2.CreateManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getCreateManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public com.google.protobuf.Empty deleteManagedFolder( + com.google.storage.control.v2.DeleteManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getDeleteManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolder( + com.google.storage.control.v2.GetManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getGetManagedFolderMethod(), getCallOptions(), request); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public com.google.storage.control.v2.ListManagedFoldersResponse listManagedFolders( + com.google.storage.control.v2.ListManagedFoldersRequest request) { + return io.grpc.stub.ClientCalls.blockingUnaryCall( + getChannel(), getListManagedFoldersMethod(), getCallOptions(), request); + } } /** @@ -767,6 +1128,61 @@ protected StorageControlFutureStub build( return io.grpc.stub.ClientCalls.futureUnaryCall( getChannel().newCall(getGetStorageLayoutMethod(), getCallOptions()), request); } + + /** + * + * + *
        +     * Creates a new managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ManagedFolder> + createManagedFolder(com.google.storage.control.v2.CreateManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getCreateManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Permanently deletes an empty managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture + deleteManagedFolder(com.google.storage.control.v2.DeleteManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getDeleteManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Returns metadata for the specified managed folder.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ManagedFolder> + getManagedFolder(com.google.storage.control.v2.GetManagedFolderRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getGetManagedFolderMethod(), getCallOptions()), request); + } + + /** + * + * + *
        +     * Retrieves a list of managed folders for a given bucket.
        +     * 
        + */ + public com.google.common.util.concurrent.ListenableFuture< + com.google.storage.control.v2.ListManagedFoldersResponse> + listManagedFolders(com.google.storage.control.v2.ListManagedFoldersRequest request) { + return io.grpc.stub.ClientCalls.futureUnaryCall( + getChannel().newCall(getListManagedFoldersMethod(), getCallOptions()), request); + } } private static final int METHODID_CREATE_FOLDER = 0; @@ -775,6 +1191,10 @@ protected StorageControlFutureStub build( private static final int METHODID_LIST_FOLDERS = 3; private static final int METHODID_RENAME_FOLDER = 4; private static final int METHODID_GET_STORAGE_LAYOUT = 5; + private static final int METHODID_CREATE_MANAGED_FOLDER = 6; + private static final int METHODID_DELETE_MANAGED_FOLDER = 7; + private static final int METHODID_GET_MANAGED_FOLDER = 8; + private static final int METHODID_LIST_MANAGED_FOLDERS = 9; private static final class MethodHandlers implements io.grpc.stub.ServerCalls.UnaryMethod, @@ -825,6 +1245,30 @@ public void invoke(Req request, io.grpc.stub.StreamObserver responseObserv (io.grpc.stub.StreamObserver) responseObserver); break; + case METHODID_CREATE_MANAGED_FOLDER: + serviceImpl.createManagedFolder( + (com.google.storage.control.v2.CreateManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) + responseObserver); + break; + case METHODID_DELETE_MANAGED_FOLDER: + serviceImpl.deleteManagedFolder( + (com.google.storage.control.v2.DeleteManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) responseObserver); + break; + case METHODID_GET_MANAGED_FOLDER: + serviceImpl.getManagedFolder( + (com.google.storage.control.v2.GetManagedFolderRequest) request, + (io.grpc.stub.StreamObserver) + responseObserver); + break; + case METHODID_LIST_MANAGED_FOLDERS: + serviceImpl.listManagedFolders( + (com.google.storage.control.v2.ListManagedFoldersRequest) request, + (io.grpc.stub.StreamObserver< + com.google.storage.control.v2.ListManagedFoldersResponse>) + responseObserver); + break; default: throw new AssertionError(); } @@ -881,6 +1325,33 @@ public static final io.grpc.ServerServiceDefinition bindService(AsyncService ser com.google.storage.control.v2.GetStorageLayoutRequest, com.google.storage.control.v2.StorageLayout>( service, METHODID_GET_STORAGE_LAYOUT))) + .addMethod( + getCreateManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.CreateManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder>( + service, METHODID_CREATE_MANAGED_FOLDER))) + .addMethod( + getDeleteManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.DeleteManagedFolderRequest, + com.google.protobuf.Empty>(service, METHODID_DELETE_MANAGED_FOLDER))) + .addMethod( + getGetManagedFolderMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.GetManagedFolderRequest, + com.google.storage.control.v2.ManagedFolder>( + service, METHODID_GET_MANAGED_FOLDER))) + .addMethod( + getListManagedFoldersMethod(), + io.grpc.stub.ServerCalls.asyncUnaryCall( + new MethodHandlers< + com.google.storage.control.v2.ListManagedFoldersRequest, + com.google.storage.control.v2.ListManagedFoldersResponse>( + service, METHODID_LIST_MANAGED_FOLDERS))) .build(); } @@ -938,6 +1409,10 @@ public static io.grpc.ServiceDescriptor getServiceDescriptor() { .addMethod(getListFoldersMethod()) .addMethod(getRenameFolderMethod()) .addMethod(getGetStorageLayoutMethod()) + .addMethod(getCreateManagedFolderMethod()) + .addMethod(getDeleteManagedFolderMethod()) + .addMethod(getGetManagedFolderMethod()) + .addMethod(getListManagedFoldersMethod()) .build(); } } diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 04096f708a..4f0df73852 100644 --- a/grpc-google-cloud-storage-v2/pom.xml +++ b/grpc-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/pom.xml b/pom.xml index 50c6569329..8aaf36f4f9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.36.1 + 2.37.0 Storage Parent https://github.com/googleapis/java-storage @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.28.1 + 3.29.0 @@ -76,23 +76,17 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.37.0 com.google.apis google-api-services-storage - v1-rev20240311-2.0.0 + v1-rev20240319-2.0.0 com.google.cloud google-cloud-pubsub - 1.127.2 - test - - - org.easymock - easymock - 4.3 + 1.129.0 test @@ -100,49 +94,36 @@ mockito-core 4.11.0 test - - - - org.objenesis - objenesis - - - - - org.objenesis - objenesis - 3.3 - test com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc gapic-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha com.google.cloud google-cloud-storage-control - 2.36.1-alpha + 2.37.0-alpha com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index a0c8d8e62b..3a14b19d1f 100644 --- a/proto-google-cloud-storage-control-v2/pom.xml +++ b/proto-google-cloud-storage-control-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.36.1-alpha + 2.37.0-alpha proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java index 450d880c9c..c5d0bb3ced 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java index 0428e34e02..e203b7dacb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CommonLongRunningOperationMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface CommonLongRunningOperationMetadataOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java index 53c70b3c54..9fe4ed2e72 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** @@ -187,7 +187,11 @@ public com.google.storage.control.v2.FolderOrBuilder getFolderOrBuilder() { * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -210,7 +214,11 @@ public java.lang.String getFolderId() { * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1105,7 +1113,11 @@ public com.google.storage.control.v2.FolderOrBuilder getFolderOrBuilder() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1127,7 +1139,11 @@ public java.lang.String getFolderId() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1149,7 +1165,11 @@ public com.google.protobuf.ByteString getFolderIdBytes() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1170,7 +1190,11 @@ public Builder setFolderId(java.lang.String value) { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -1187,7 +1211,11 @@ public Builder clearFolderId() { * * *
        -     * Required. The absolute path of the folder, using a single `/` as delimiter.
        +     * Required. The full name of a folder, including all its parent folders.
        +     * Folders use single '/' characters as a delimiter.
        +     * The folder_id must end with a slash.
        +     * For example, the folder_id of "books/biographies/" would create a new
        +     * "biographies/" folder under the "books/" folder.
              * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java index 9d93558a4b..38b0041b5a 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface CreateFolderRequestOrBuilder @@ -104,7 +104,11 @@ public interface CreateFolderRequestOrBuilder * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; @@ -116,7 +120,11 @@ public interface CreateFolderRequestOrBuilder * * *
        -   * Required. The absolute path of the folder, using a single `/` as delimiter.
        +   * Required. The full name of a folder, including all its parent folders.
        +   * Folders use single '/' characters as a delimiter.
        +   * The folder_id must end with a slash.
        +   * For example, the folder_id of "books/biographies/" would create a new
        +   * "biographies/" folder under the "books/" folder.
            * 
        * * string folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java new file mode 100644 index 0000000000..7442427387 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequest.java @@ -0,0 +1,1373 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for CreateManagedFolder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.CreateManagedFolderRequest} + */ +public final class CreateManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.CreateManagedFolderRequest) + CreateManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use CreateManagedFolderRequest.newBuilder() to construct. + private CreateManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private CreateManagedFolderRequest() { + parent_ = ""; + managedFolderId_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new CreateManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.CreateManagedFolderRequest.class, + com.google.storage.control.v2.CreateManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int PARENT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object parent_ = ""; + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + @java.lang.Override + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + @java.lang.Override + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int MANAGED_FOLDER_FIELD_NUMBER = 2; + private com.google.storage.control.v2.ManagedFolder managedFolder_; + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + @java.lang.Override + public boolean hasManagedFolder() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getManagedFolder() { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder() { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + + public static final int MANAGED_FOLDER_ID_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object managedFolderId_ = ""; + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + @java.lang.Override + public java.lang.String getManagedFolderId() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + managedFolderId_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getManagedFolderIdBytes() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + managedFolderId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REQUEST_ID_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, parent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(2, getManagedFolder()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(managedFolderId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, managedFolderId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, requestId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, parent_); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getManagedFolder()); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(managedFolderId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, managedFolderId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, requestId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.CreateManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.CreateManagedFolderRequest other = + (com.google.storage.control.v2.CreateManagedFolderRequest) obj; + + if (!getParent().equals(other.getParent())) return false; + if (hasManagedFolder() != other.hasManagedFolder()) return false; + if (hasManagedFolder()) { + if (!getManagedFolder().equals(other.getManagedFolder())) return false; + } + if (!getManagedFolderId().equals(other.getManagedFolderId())) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PARENT_FIELD_NUMBER; + hash = (53 * hash) + getParent().hashCode(); + if (hasManagedFolder()) { + hash = (37 * hash) + MANAGED_FOLDER_FIELD_NUMBER; + hash = (53 * hash) + getManagedFolder().hashCode(); + } + hash = (37 * hash) + MANAGED_FOLDER_ID_FIELD_NUMBER; + hash = (53 * hash) + getManagedFolderId().hashCode(); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.CreateManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for CreateManagedFolder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.CreateManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.CreateManagedFolderRequest) + com.google.storage.control.v2.CreateManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.CreateManagedFolderRequest.class, + com.google.storage.control.v2.CreateManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.CreateManagedFolderRequest.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getManagedFolderFieldBuilder(); + } + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + parent_ = ""; + managedFolder_ = null; + if (managedFolderBuilder_ != null) { + managedFolderBuilder_.dispose(); + managedFolderBuilder_ = null; + } + managedFolderId_ = ""; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.CreateManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest build() { + com.google.storage.control.v2.CreateManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest buildPartial() { + com.google.storage.control.v2.CreateManagedFolderRequest result = + new com.google.storage.control.v2.CreateManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.CreateManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.parent_ = parent_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.managedFolder_ = + managedFolderBuilder_ == null ? managedFolder_ : managedFolderBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.managedFolderId_ = managedFolderId_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.CreateManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.CreateManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.CreateManagedFolderRequest other) { + if (other == com.google.storage.control.v2.CreateManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getParent().isEmpty()) { + parent_ = other.parent_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasManagedFolder()) { + mergeManagedFolder(other.getManagedFolder()); + } + if (!other.getManagedFolderId().isEmpty()) { + managedFolderId_ = other.managedFolderId_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000008; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + parent_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: + { + input.readMessage(getManagedFolderFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: + { + managedFolderId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 34 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object parent_ = ""; + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The parent to set. + * @return This builder for chaining. + */ + public Builder setParent(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearParent() { + parent_ = getDefaultInstance().getParent(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for parent to set. + * @return This builder for chaining. + */ + public Builder setParentBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private com.google.storage.control.v2.ManagedFolder managedFolder_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + managedFolderBuilder_; + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + public boolean hasManagedFolder() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolder() { + if (managedFolderBuilder_ == null) { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } else { + return managedFolderBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder setManagedFolder(com.google.storage.control.v2.ManagedFolder value) { + if (managedFolderBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + managedFolder_ = value; + } else { + managedFolderBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder setManagedFolder( + com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFolderBuilder_ == null) { + managedFolder_ = builderForValue.build(); + } else { + managedFolderBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder mergeManagedFolder(com.google.storage.control.v2.ManagedFolder value) { + if (managedFolderBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) + && managedFolder_ != null + && managedFolder_ != com.google.storage.control.v2.ManagedFolder.getDefaultInstance()) { + getManagedFolderBuilder().mergeFrom(value); + } else { + managedFolder_ = value; + } + } else { + managedFolderBuilder_.mergeFrom(value); + } + if (managedFolder_ != null) { + bitField0_ |= 0x00000002; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public Builder clearManagedFolder() { + bitField0_ = (bitField0_ & ~0x00000002); + managedFolder_ = null; + if (managedFolderBuilder_ != null) { + managedFolderBuilder_.dispose(); + managedFolderBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public com.google.storage.control.v2.ManagedFolder.Builder getManagedFolderBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getManagedFolderFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder() { + if (managedFolderBuilder_ != null) { + return managedFolderBuilder_.getMessageOrBuilder(); + } else { + return managedFolder_ == null + ? com.google.storage.control.v2.ManagedFolder.getDefaultInstance() + : managedFolder_; + } + } + /** + * + * + *
        +     * Required. Properties of the managed folder being created.
        +     * The bucket and managed folder names are specified in the `parent` and
        +     * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +     * will result in an error.
        +     * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + getManagedFolderFieldBuilder() { + if (managedFolderBuilder_ == null) { + managedFolderBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder>( + getManagedFolder(), getParentForChildren(), isClean()); + managedFolder_ = null; + } + return managedFolderBuilder_; + } + + private java.lang.Object managedFolderId_ = ""; + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + public java.lang.String getManagedFolderId() { + java.lang.Object ref = managedFolderId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + managedFolderId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + public com.google.protobuf.ByteString getManagedFolderIdBytes() { + java.lang.Object ref = managedFolderId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + managedFolderId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @param value The managedFolderId to set. + * @return This builder for chaining. + */ + public Builder setManagedFolderId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + managedFolderId_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return This builder for chaining. + */ + public Builder clearManagedFolderId() { + managedFolderId_ = getDefaultInstance().getManagedFolderId(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. The name of the managed folder. It uses a single `/` as delimiter
        +     * and leading and trailing `/` are allowed.
        +     * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @param value The bytes for managedFolderId to set. + * @return This builder for chaining. + */ + public Builder setManagedFolderIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + managedFolderId_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.CreateManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.CreateManagedFolderRequest) + private static final com.google.storage.control.v2.CreateManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.CreateManagedFolderRequest(); + } + + public static com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public CreateManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.CreateManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..d59a43a153 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateManagedFolderRequestOrBuilder.java @@ -0,0 +1,163 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface CreateManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.CreateManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + java.lang.String getParent(); + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + com.google.protobuf.ByteString getParentBytes(); + + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return Whether the managedFolder field is set. + */ + boolean hasManagedFolder(); + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + * + * @return The managedFolder. + */ + com.google.storage.control.v2.ManagedFolder getManagedFolder(); + /** + * + * + *
        +   * Required. Properties of the managed folder being created.
        +   * The bucket and managed folder names are specified in the `parent` and
        +   * `managed_folder_id` fields. Populating these fields in `managed_folder`
        +   * will result in an error.
        +   * 
        + * + * + * .google.storage.control.v2.ManagedFolder managed_folder = 2 [(.google.api.field_behavior) = REQUIRED]; + * + */ + com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFolderOrBuilder(); + + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The managedFolderId. + */ + java.lang.String getManagedFolderId(); + /** + * + * + *
        +   * Required. The name of the managed folder. It uses a single `/` as delimiter
        +   * and leading and trailing `/` are allowed.
        +   * 
        + * + * string managed_folder_id = 3 [(.google.api.field_behavior) = REQUIRED]; + * + * @return The bytes for managedFolderId. + */ + com.google.protobuf.ByteString getManagedFolderIdBytes(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 4 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java index 8950379c47..5c70210277 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java index ce10b4540b..2e7004fde4 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface DeleteFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java new file mode 100644 index 0000000000..a46860075d --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequest.java @@ -0,0 +1,1235 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * DeleteManagedFolder RPC request message.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.DeleteManagedFolderRequest} + */ +public final class DeleteManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.DeleteManagedFolderRequest) + DeleteManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use DeleteManagedFolderRequest.newBuilder() to construct. + private DeleteManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private DeleteManagedFolderRequest() { + name_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new DeleteManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.DeleteManagedFolderRequest.class, + com.google.storage.control.v2.DeleteManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 7; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int IF_METAGENERATION_MATCH_FIELD_NUMBER = 3; + private long ifMetagenerationMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + + public static final int IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER = 4; + private long ifMetagenerationNotMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + + public static final int ALLOW_NON_EMPTY_FIELD_NUMBER = 5; + private boolean allowNonEmpty_ = false; + /** + * + * + *
        +   * Allows deletion of a managed folder even if it is not empty.
        +   * A managed folder is empty if it manages no child managed folders or
        +   * objects. Caller must have permission for
        +   * storage.managedFolders.setIamPolicy.
        +   * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + @java.lang.Override + public boolean getAllowNonEmpty() { + return allowNonEmpty_; + } + + public static final int REQUEST_ID_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(4, ifMetagenerationNotMatch_); + } + if (allowNonEmpty_ != false) { + output.writeBool(5, allowNonEmpty_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 7, name_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(4, ifMetagenerationNotMatch_); + } + if (allowNonEmpty_ != false) { + size += com.google.protobuf.CodedOutputStream.computeBoolSize(5, allowNonEmpty_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, name_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.DeleteManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.DeleteManagedFolderRequest other = + (com.google.storage.control.v2.DeleteManagedFolderRequest) obj; + + if (!getName().equals(other.getName())) return false; + if (hasIfMetagenerationMatch() != other.hasIfMetagenerationMatch()) return false; + if (hasIfMetagenerationMatch()) { + if (getIfMetagenerationMatch() != other.getIfMetagenerationMatch()) return false; + } + if (hasIfMetagenerationNotMatch() != other.hasIfMetagenerationNotMatch()) return false; + if (hasIfMetagenerationNotMatch()) { + if (getIfMetagenerationNotMatch() != other.getIfMetagenerationNotMatch()) return false; + } + if (getAllowNonEmpty() != other.getAllowNonEmpty()) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasIfMetagenerationMatch()) { + hash = (37 * hash) + IF_METAGENERATION_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationMatch()); + } + if (hasIfMetagenerationNotMatch()) { + hash = (37 * hash) + IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationNotMatch()); + } + hash = (37 * hash) + ALLOW_NON_EMPTY_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getAllowNonEmpty()); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.DeleteManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * DeleteManagedFolder RPC request message.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.DeleteManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.DeleteManagedFolderRequest) + com.google.storage.control.v2.DeleteManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.DeleteManagedFolderRequest.class, + com.google.storage.control.v2.DeleteManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.DeleteManagedFolderRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + ifMetagenerationMatch_ = 0L; + ifMetagenerationNotMatch_ = 0L; + allowNonEmpty_ = false; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.DeleteManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest build() { + com.google.storage.control.v2.DeleteManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest buildPartial() { + com.google.storage.control.v2.DeleteManagedFolderRequest result = + new com.google.storage.control.v2.DeleteManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.DeleteManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.ifMetagenerationMatch_ = ifMetagenerationMatch_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.ifMetagenerationNotMatch_ = ifMetagenerationNotMatch_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.allowNonEmpty_ = allowNonEmpty_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.DeleteManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.DeleteManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.DeleteManagedFolderRequest other) { + if (other == com.google.storage.control.v2.DeleteManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasIfMetagenerationMatch()) { + setIfMetagenerationMatch(other.getIfMetagenerationMatch()); + } + if (other.hasIfMetagenerationNotMatch()) { + setIfMetagenerationNotMatch(other.getIfMetagenerationNotMatch()); + } + if (other.getAllowNonEmpty() != false) { + setAllowNonEmpty(other.getAllowNonEmpty()); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000010; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 24: + { + ifMetagenerationMatch_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 32: + { + ifMetagenerationNotMatch_ = input.readInt64(); + bitField0_ |= 0x00000004; + break; + } // case 32 + case 40: + { + allowNonEmpty_ = input.readBool(); + bitField0_ |= 0x00000008; + break; + } // case 40 + case 50: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } // case 50 + case 58: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 58 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long ifMetagenerationMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @param value The ifMetagenerationMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationMatch(long value) { + + ifMetagenerationMatch_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationMatch() { + bitField0_ = (bitField0_ & ~0x00000002); + ifMetagenerationMatch_ = 0L; + onChanged(); + return this; + } + + private long ifMetagenerationNotMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @param value The ifMetagenerationNotMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationNotMatch(long value) { + + ifMetagenerationNotMatch_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationNotMatch() { + bitField0_ = (bitField0_ & ~0x00000004); + ifMetagenerationNotMatch_ = 0L; + onChanged(); + return this; + } + + private boolean allowNonEmpty_; + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + @java.lang.Override + public boolean getAllowNonEmpty() { + return allowNonEmpty_; + } + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @param value The allowNonEmpty to set. + * @return This builder for chaining. + */ + public Builder setAllowNonEmpty(boolean value) { + + allowNonEmpty_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Allows deletion of a managed folder even if it is not empty.
        +     * A managed folder is empty if it manages no child managed folders or
        +     * objects. Caller must have permission for
        +     * storage.managedFolders.setIamPolicy.
        +     * 
        + * + * bool allow_non_empty = 5; + * + * @return This builder for chaining. + */ + public Builder clearAllowNonEmpty() { + bitField0_ = (bitField0_ & ~0x00000008); + allowNonEmpty_ = false; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.DeleteManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.DeleteManagedFolderRequest) + private static final com.google.storage.control.v2.DeleteManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.DeleteManagedFolderRequest(); + } + + public static com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public DeleteManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.DeleteManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..953ece8b28 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DeleteManagedFolderRequestOrBuilder.java @@ -0,0 +1,160 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface DeleteManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.DeleteManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 7 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + boolean hasIfMetagenerationMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + long getIfMetagenerationMatch(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + boolean hasIfMetagenerationNotMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + long getIfMetagenerationNotMatch(); + + /** + * + * + *
        +   * Allows deletion of a managed folder even if it is not empty.
        +   * A managed folder is empty if it manages no child managed folders or
        +   * objects. Caller must have permission for
        +   * storage.managedFolders.setIamPolicy.
        +   * 
        + * + * bool allow_non_empty = 5; + * + * @return The allowNonEmpty. + */ + boolean getAllowNonEmpty(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 6 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java index 728778d85f..c05fc4574a 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/Folder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java index bdf7597c99..b6a87b4ac1 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface FolderOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java index 8cc43b7e32..abaa8c2ab6 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java index f8db8af0b1..2041920c33 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface GetFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java new file mode 100644 index 0000000000..1d79d2235e --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequest.java @@ -0,0 +1,1130 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for GetManagedFolder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.GetManagedFolderRequest} + */ +public final class GetManagedFolderRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.GetManagedFolderRequest) + GetManagedFolderRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use GetManagedFolderRequest.newBuilder() to construct. + private GetManagedFolderRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private GetManagedFolderRequest() { + name_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new GetManagedFolderRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.GetManagedFolderRequest.class, + com.google.storage.control.v2.GetManagedFolderRequest.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 6; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int IF_METAGENERATION_MATCH_FIELD_NUMBER = 3; + private long ifMetagenerationMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + + public static final int IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER = 4; + private long ifMetagenerationNotMatch_ = 0L; + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + + public static final int REQUEST_ID_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (((bitField0_ & 0x00000001) != 0)) { + output.writeInt64(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeInt64(4, ifMetagenerationNotMatch_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 6, name_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, ifMetagenerationMatch_); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(4, ifMetagenerationNotMatch_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, requestId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, name_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.GetManagedFolderRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.GetManagedFolderRequest other = + (com.google.storage.control.v2.GetManagedFolderRequest) obj; + + if (!getName().equals(other.getName())) return false; + if (hasIfMetagenerationMatch() != other.hasIfMetagenerationMatch()) return false; + if (hasIfMetagenerationMatch()) { + if (getIfMetagenerationMatch() != other.getIfMetagenerationMatch()) return false; + } + if (hasIfMetagenerationNotMatch() != other.hasIfMetagenerationNotMatch()) return false; + if (hasIfMetagenerationNotMatch()) { + if (getIfMetagenerationNotMatch() != other.getIfMetagenerationNotMatch()) return false; + } + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + if (hasIfMetagenerationMatch()) { + hash = (37 * hash) + IF_METAGENERATION_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationMatch()); + } + if (hasIfMetagenerationNotMatch()) { + hash = (37 * hash) + IF_METAGENERATION_NOT_MATCH_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getIfMetagenerationNotMatch()); + } + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.GetManagedFolderRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for GetManagedFolder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.GetManagedFolderRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.GetManagedFolderRequest) + com.google.storage.control.v2.GetManagedFolderRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.GetManagedFolderRequest.class, + com.google.storage.control.v2.GetManagedFolderRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.GetManagedFolderRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + ifMetagenerationMatch_ = 0L; + ifMetagenerationNotMatch_ = 0L; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.GetManagedFolderRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest build() { + com.google.storage.control.v2.GetManagedFolderRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest buildPartial() { + com.google.storage.control.v2.GetManagedFolderRequest result = + new com.google.storage.control.v2.GetManagedFolderRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.GetManagedFolderRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.ifMetagenerationMatch_ = ifMetagenerationMatch_; + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.ifMetagenerationNotMatch_ = ifMetagenerationNotMatch_; + to_bitField0_ |= 0x00000002; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.requestId_ = requestId_; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.GetManagedFolderRequest) { + return mergeFrom((com.google.storage.control.v2.GetManagedFolderRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.GetManagedFolderRequest other) { + if (other == com.google.storage.control.v2.GetManagedFolderRequest.getDefaultInstance()) + return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasIfMetagenerationMatch()) { + setIfMetagenerationMatch(other.getIfMetagenerationMatch()); + } + if (other.hasIfMetagenerationNotMatch()) { + setIfMetagenerationNotMatch(other.getIfMetagenerationNotMatch()); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000008; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 24: + { + ifMetagenerationMatch_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 32: + { + ifMetagenerationNotMatch_ = input.readInt64(); + bitField0_ |= 0x00000004; + break; + } // case 32 + case 42: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 42 + case 50: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 50 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long ifMetagenerationMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationMatch() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + @java.lang.Override + public long getIfMetagenerationMatch() { + return ifMetagenerationMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @param value The ifMetagenerationMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationMatch(long value) { + + ifMetagenerationMatch_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationMatch() { + bitField0_ = (bitField0_ & ~0x00000002); + ifMetagenerationMatch_ = 0L; + onChanged(); + return this; + } + + private long ifMetagenerationNotMatch_; + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + @java.lang.Override + public boolean hasIfMetagenerationNotMatch() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + @java.lang.Override + public long getIfMetagenerationNotMatch() { + return ifMetagenerationNotMatch_; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @param value The ifMetagenerationNotMatch to set. + * @return This builder for chaining. + */ + public Builder setIfMetagenerationNotMatch(long value) { + + ifMetagenerationNotMatch_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * The operation succeeds conditional on the managed folder's current
        +     * metageneration NOT matching the value here specified.
        +     * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return This builder for chaining. + */ + public Builder clearIfMetagenerationNotMatch() { + bitField0_ = (bitField0_ & ~0x00000004); + ifMetagenerationNotMatch_ = 0L; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.GetManagedFolderRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.GetManagedFolderRequest) + private static final com.google.storage.control.v2.GetManagedFolderRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.GetManagedFolderRequest(); + } + + public static com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public GetManagedFolderRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.GetManagedFolderRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java new file mode 100644 index 0000000000..191c0a1500 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetManagedFolderRequestOrBuilder.java @@ -0,0 +1,144 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface GetManagedFolderRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.GetManagedFolderRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Required. Name of the managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * + * string name = 6 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return Whether the ifMetagenerationMatch field is set. + */ + boolean hasIfMetagenerationMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_match = 3; + * + * @return The ifMetagenerationMatch. + */ + long getIfMetagenerationMatch(); + + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return Whether the ifMetagenerationNotMatch field is set. + */ + boolean hasIfMetagenerationNotMatch(); + /** + * + * + *
        +   * The operation succeeds conditional on the managed folder's current
        +   * metageneration NOT matching the value here specified.
        +   * 
        + * + * optional int64 if_metageneration_not_match = 4; + * + * @return The ifMetagenerationNotMatch. + */ + long getIfMetagenerationNotMatch(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java index 8133a90f29..63c3eae7f0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java index e2abad0ded..984bd15a2e 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetStorageLayoutRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface GetStorageLayoutRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java index 9a6815d010..0d8481b802 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java index 0f96630df6..113d2ff3eb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface ListFoldersRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java index bd59965732..31f6c07568 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java index 66b433997b..fb158a83fb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListFoldersResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface ListFoldersResponseOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java new file mode 100644 index 0000000000..999775be33 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequest.java @@ -0,0 +1,1318 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Request message for ListManagedFolders.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersRequest} + */ +public final class ListManagedFoldersRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ListManagedFoldersRequest) + ListManagedFoldersRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use ListManagedFoldersRequest.newBuilder() to construct. + private ListManagedFoldersRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ListManagedFoldersRequest() { + parent_ = ""; + pageToken_ = ""; + prefix_ = ""; + requestId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ListManagedFoldersRequest(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersRequest.class, + com.google.storage.control.v2.ListManagedFoldersRequest.Builder.class); + } + + public static final int PARENT_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object parent_ = ""; + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + @java.lang.Override + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } + } + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + @java.lang.Override + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PAGE_SIZE_FIELD_NUMBER = 2; + private int pageSize_ = 0; + /** + * + * + *
        +   * Optional. Maximum number of managed folders to return in a single response.
        +   * The service will use this parameter or 1,000 items, whichever is smaller.
        +   * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + @java.lang.Override + public int getPageSize() { + return pageSize_; + } + + public static final int PAGE_TOKEN_FIELD_NUMBER = 3; + + @SuppressWarnings("serial") + private volatile java.lang.Object pageToken_ = ""; + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + @java.lang.Override + public java.lang.String getPageToken() { + java.lang.Object ref = pageToken_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pageToken_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPageTokenBytes() { + java.lang.Object ref = pageToken_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + pageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int PREFIX_FIELD_NUMBER = 4; + + @SuppressWarnings("serial") + private volatile java.lang.Object prefix_ = ""; + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + @java.lang.Override + public java.lang.String getPrefix() { + java.lang.Object ref = prefix_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + prefix_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPrefixBytes() { + java.lang.Object ref = prefix_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REQUEST_ID_FIELD_NUMBER = 5; + + @SuppressWarnings("serial") + private volatile java.lang.Object requestId_ = ""; + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + @java.lang.Override + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } + } + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, parent_); + } + if (pageSize_ != 0) { + output.writeInt32(2, pageSize_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pageToken_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, pageToken_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(prefix_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, prefix_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 5, requestId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(parent_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, parent_); + } + if (pageSize_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeInt32Size(2, pageSize_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(pageToken_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, pageToken_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(prefix_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, prefix_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(requestId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, requestId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ListManagedFoldersRequest)) { + return super.equals(obj); + } + com.google.storage.control.v2.ListManagedFoldersRequest other = + (com.google.storage.control.v2.ListManagedFoldersRequest) obj; + + if (!getParent().equals(other.getParent())) return false; + if (getPageSize() != other.getPageSize()) return false; + if (!getPageToken().equals(other.getPageToken())) return false; + if (!getPrefix().equals(other.getPrefix())) return false; + if (!getRequestId().equals(other.getRequestId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PARENT_FIELD_NUMBER; + hash = (53 * hash) + getParent().hashCode(); + hash = (37 * hash) + PAGE_SIZE_FIELD_NUMBER; + hash = (53 * hash) + getPageSize(); + hash = (37 * hash) + PAGE_TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getPageToken().hashCode(); + hash = (37 * hash) + PREFIX_FIELD_NUMBER; + hash = (53 * hash) + getPrefix().hashCode(); + hash = (37 * hash) + REQUEST_ID_FIELD_NUMBER; + hash = (53 * hash) + getRequestId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.ListManagedFoldersRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Request message for ListManagedFolders.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersRequest} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ListManagedFoldersRequest) + com.google.storage.control.v2.ListManagedFoldersRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersRequest.class, + com.google.storage.control.v2.ListManagedFoldersRequest.Builder.class); + } + + // Construct using com.google.storage.control.v2.ListManagedFoldersRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + parent_ = ""; + pageSize_ = 0; + pageToken_ = ""; + prefix_ = ""; + requestId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstanceForType() { + return com.google.storage.control.v2.ListManagedFoldersRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest build() { + com.google.storage.control.v2.ListManagedFoldersRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest buildPartial() { + com.google.storage.control.v2.ListManagedFoldersRequest result = + new com.google.storage.control.v2.ListManagedFoldersRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.ListManagedFoldersRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.parent_ = parent_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.pageSize_ = pageSize_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.pageToken_ = pageToken_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.prefix_ = prefix_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.requestId_ = requestId_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ListManagedFoldersRequest) { + return mergeFrom((com.google.storage.control.v2.ListManagedFoldersRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ListManagedFoldersRequest other) { + if (other == com.google.storage.control.v2.ListManagedFoldersRequest.getDefaultInstance()) + return this; + if (!other.getParent().isEmpty()) { + parent_ = other.parent_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getPageSize() != 0) { + setPageSize(other.getPageSize()); + } + if (!other.getPageToken().isEmpty()) { + pageToken_ = other.pageToken_; + bitField0_ |= 0x00000004; + onChanged(); + } + if (!other.getPrefix().isEmpty()) { + prefix_ = other.prefix_; + bitField0_ |= 0x00000008; + onChanged(); + } + if (!other.getRequestId().isEmpty()) { + requestId_ = other.requestId_; + bitField0_ |= 0x00000010; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + parent_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 16: + { + pageSize_ = input.readInt32(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 26: + { + pageToken_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: + { + prefix_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000008; + break; + } // case 34 + case 42: + { + requestId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000010; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object parent_ = ""; + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + public java.lang.String getParent() { + java.lang.Object ref = parent_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + parent_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + public com.google.protobuf.ByteString getParentBytes() { + java.lang.Object ref = parent_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + parent_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The parent to set. + * @return This builder for chaining. + */ + public Builder setParent(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearParent() { + parent_ = getDefaultInstance().getParent(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Required. Name of the bucket this managed folder belongs to.
        +     * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @param value The bytes for parent to set. + * @return This builder for chaining. + */ + public Builder setParentBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + parent_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private int pageSize_; + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + @java.lang.Override + public int getPageSize() { + return pageSize_; + } + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The pageSize to set. + * @return This builder for chaining. + */ + public Builder setPageSize(int value) { + + pageSize_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Maximum number of managed folders to return in a single response.
        +     * The service will use this parameter or 1,000 items, whichever is smaller.
        +     * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPageSize() { + bitField0_ = (bitField0_ & ~0x00000002); + pageSize_ = 0; + onChanged(); + return this; + } + + private java.lang.Object pageToken_ = ""; + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + public java.lang.String getPageToken() { + java.lang.Object ref = pageToken_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + pageToken_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + public com.google.protobuf.ByteString getPageTokenBytes() { + java.lang.Object ref = pageToken_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + pageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The pageToken to set. + * @return This builder for chaining. + */ + public Builder setPageToken(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + pageToken_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPageToken() { + pageToken_ = getDefaultInstance().getPageToken(); + bitField0_ = (bitField0_ & ~0x00000004); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A previously-returned page token representing part of the larger
        +     * set of results to view.
        +     * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The bytes for pageToken to set. + * @return This builder for chaining. + */ + public Builder setPageTokenBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + pageToken_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + private java.lang.Object prefix_ = ""; + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + public java.lang.String getPrefix() { + java.lang.Object ref = prefix_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + prefix_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + public com.google.protobuf.ByteString getPrefixBytes() { + java.lang.Object ref = prefix_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + prefix_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The prefix to set. + * @return This builder for chaining. + */ + public Builder setPrefix(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + prefix_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return This builder for chaining. + */ + public Builder clearPrefix() { + prefix_ = getDefaultInstance().getPrefix(); + bitField0_ = (bitField0_ & ~0x00000008); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. Filter results to match managed folders with name starting with
        +     * this prefix.
        +     * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @param value The bytes for prefix to set. + * @return This builder for chaining. + */ + public Builder setPrefixBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + prefix_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + private java.lang.Object requestId_ = ""; + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + public java.lang.String getRequestId() { + java.lang.Object ref = requestId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + requestId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + public com.google.protobuf.ByteString getRequestIdBytes() { + java.lang.Object ref = requestId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + requestId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return This builder for chaining. + */ + public Builder clearRequestId() { + requestId_ = getDefaultInstance().getRequestId(); + bitField0_ = (bitField0_ & ~0x00000010); + onChanged(); + return this; + } + /** + * + * + *
        +     * Optional. A unique identifier for this request. UUID is the recommended
        +     * format, but other formats are still accepted.
        +     * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @param value The bytes for requestId to set. + * @return This builder for chaining. + */ + public Builder setRequestIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + requestId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ListManagedFoldersRequest) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ListManagedFoldersRequest) + private static final com.google.storage.control.v2.ListManagedFoldersRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ListManagedFoldersRequest(); + } + + public static com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ListManagedFoldersRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java new file mode 100644 index 0000000000..0041f11360 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersRequestOrBuilder.java @@ -0,0 +1,154 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ListManagedFoldersRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ListManagedFoldersRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The parent. + */ + java.lang.String getParent(); + /** + * + * + *
        +   * Required. Name of the bucket this managed folder belongs to.
        +   * 
        + * + * + * string parent = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { ... } + * + * + * @return The bytes for parent. + */ + com.google.protobuf.ByteString getParentBytes(); + + /** + * + * + *
        +   * Optional. Maximum number of managed folders to return in a single response.
        +   * The service will use this parameter or 1,000 items, whichever is smaller.
        +   * 
        + * + * int32 page_size = 2 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageSize. + */ + int getPageSize(); + + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The pageToken. + */ + java.lang.String getPageToken(); + /** + * + * + *
        +   * Optional. A previously-returned page token representing part of the larger
        +   * set of results to view.
        +   * 
        + * + * string page_token = 3 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for pageToken. + */ + com.google.protobuf.ByteString getPageTokenBytes(); + + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The prefix. + */ + java.lang.String getPrefix(); + /** + * + * + *
        +   * Optional. Filter results to match managed folders with name starting with
        +   * this prefix.
        +   * 
        + * + * string prefix = 4 [(.google.api.field_behavior) = OPTIONAL]; + * + * @return The bytes for prefix. + */ + com.google.protobuf.ByteString getPrefixBytes(); + + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The requestId. + */ + java.lang.String getRequestId(); + /** + * + * + *
        +   * Optional. A unique identifier for this request. UUID is the recommended
        +   * format, but other formats are still accepted.
        +   * 
        + * + * + * string request_id = 5 [(.google.api.field_behavior) = OPTIONAL, (.google.api.field_info) = { ... } + * + * + * @return The bytes for requestId. + */ + com.google.protobuf.ByteString getRequestIdBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java new file mode 100644 index 0000000000..abc6cc7b1d --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponse.java @@ -0,0 +1,1133 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * Response message for ListManagedFolders.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersResponse} + */ +public final class ListManagedFoldersResponse extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ListManagedFoldersResponse) + ListManagedFoldersResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use ListManagedFoldersResponse.newBuilder() to construct. + private ListManagedFoldersResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ListManagedFoldersResponse() { + managedFolders_ = java.util.Collections.emptyList(); + nextPageToken_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ListManagedFoldersResponse(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersResponse.class, + com.google.storage.control.v2.ListManagedFoldersResponse.Builder.class); + } + + public static final int MANAGED_FOLDERS_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private java.util.List managedFolders_; + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public java.util.List getManagedFoldersList() { + return managedFolders_; + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public java.util.List + getManagedFoldersOrBuilderList() { + return managedFolders_; + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public int getManagedFoldersCount() { + return managedFolders_.size(); + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getManagedFolders(int index) { + return managedFolders_.get(index); + } + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + @java.lang.Override + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder( + int index) { + return managedFolders_.get(index); + } + + public static final int NEXT_PAGE_TOKEN_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object nextPageToken_ = ""; + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + @java.lang.Override + public java.lang.String getNextPageToken() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + nextPageToken_ = s; + return s; + } + } + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNextPageTokenBytes() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + nextPageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + for (int i = 0; i < managedFolders_.size(); i++) { + output.writeMessage(1, managedFolders_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nextPageToken_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, nextPageToken_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + for (int i = 0; i < managedFolders_.size(); i++) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, managedFolders_.get(i)); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(nextPageToken_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, nextPageToken_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ListManagedFoldersResponse)) { + return super.equals(obj); + } + com.google.storage.control.v2.ListManagedFoldersResponse other = + (com.google.storage.control.v2.ListManagedFoldersResponse) obj; + + if (!getManagedFoldersList().equals(other.getManagedFoldersList())) return false; + if (!getNextPageToken().equals(other.getNextPageToken())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (getManagedFoldersCount() > 0) { + hash = (37 * hash) + MANAGED_FOLDERS_FIELD_NUMBER; + hash = (53 * hash) + getManagedFoldersList().hashCode(); + } + hash = (37 * hash) + NEXT_PAGE_TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getNextPageToken().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.storage.control.v2.ListManagedFoldersResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * Response message for ListManagedFolders.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ListManagedFoldersResponse} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ListManagedFoldersResponse) + com.google.storage.control.v2.ListManagedFoldersResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ListManagedFoldersResponse.class, + com.google.storage.control.v2.ListManagedFoldersResponse.Builder.class); + } + + // Construct using com.google.storage.control.v2.ListManagedFoldersResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (managedFoldersBuilder_ == null) { + managedFolders_ = java.util.Collections.emptyList(); + } else { + managedFolders_ = null; + managedFoldersBuilder_.clear(); + } + bitField0_ = (bitField0_ & ~0x00000001); + nextPageToken_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstanceForType() { + return com.google.storage.control.v2.ListManagedFoldersResponse.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse build() { + com.google.storage.control.v2.ListManagedFoldersResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse buildPartial() { + com.google.storage.control.v2.ListManagedFoldersResponse result = + new com.google.storage.control.v2.ListManagedFoldersResponse(this); + buildPartialRepeatedFields(result); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartialRepeatedFields( + com.google.storage.control.v2.ListManagedFoldersResponse result) { + if (managedFoldersBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0)) { + managedFolders_ = java.util.Collections.unmodifiableList(managedFolders_); + bitField0_ = (bitField0_ & ~0x00000001); + } + result.managedFolders_ = managedFolders_; + } else { + result.managedFolders_ = managedFoldersBuilder_.build(); + } + } + + private void buildPartial0(com.google.storage.control.v2.ListManagedFoldersResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000002) != 0)) { + result.nextPageToken_ = nextPageToken_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ListManagedFoldersResponse) { + return mergeFrom((com.google.storage.control.v2.ListManagedFoldersResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ListManagedFoldersResponse other) { + if (other == com.google.storage.control.v2.ListManagedFoldersResponse.getDefaultInstance()) + return this; + if (managedFoldersBuilder_ == null) { + if (!other.managedFolders_.isEmpty()) { + if (managedFolders_.isEmpty()) { + managedFolders_ = other.managedFolders_; + bitField0_ = (bitField0_ & ~0x00000001); + } else { + ensureManagedFoldersIsMutable(); + managedFolders_.addAll(other.managedFolders_); + } + onChanged(); + } + } else { + if (!other.managedFolders_.isEmpty()) { + if (managedFoldersBuilder_.isEmpty()) { + managedFoldersBuilder_.dispose(); + managedFoldersBuilder_ = null; + managedFolders_ = other.managedFolders_; + bitField0_ = (bitField0_ & ~0x00000001); + managedFoldersBuilder_ = + com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders + ? getManagedFoldersFieldBuilder() + : null; + } else { + managedFoldersBuilder_.addAllMessages(other.managedFolders_); + } + } + } + if (!other.getNextPageToken().isEmpty()) { + nextPageToken_ = other.nextPageToken_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + com.google.storage.control.v2.ManagedFolder m = + input.readMessage( + com.google.storage.control.v2.ManagedFolder.parser(), extensionRegistry); + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(m); + } else { + managedFoldersBuilder_.addMessage(m); + } + break; + } // case 10 + case 18: + { + nextPageToken_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.util.List managedFolders_ = + java.util.Collections.emptyList(); + + private void ensureManagedFoldersIsMutable() { + if (!((bitField0_ & 0x00000001) != 0)) { + managedFolders_ = + new java.util.ArrayList(managedFolders_); + bitField0_ |= 0x00000001; + } + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + managedFoldersBuilder_; + + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List getManagedFoldersList() { + if (managedFoldersBuilder_ == null) { + return java.util.Collections.unmodifiableList(managedFolders_); + } else { + return managedFoldersBuilder_.getMessageList(); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public int getManagedFoldersCount() { + if (managedFoldersBuilder_ == null) { + return managedFolders_.size(); + } else { + return managedFoldersBuilder_.getCount(); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder getManagedFolders(int index) { + if (managedFoldersBuilder_ == null) { + return managedFolders_.get(index); + } else { + return managedFoldersBuilder_.getMessage(index); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder setManagedFolders(int index, com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.set(index, value); + onChanged(); + } else { + managedFoldersBuilder_.setMessage(index, value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder setManagedFolders( + int index, com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.set(index, builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.setMessage(index, builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders(com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.add(value); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders(int index, com.google.storage.control.v2.ManagedFolder value) { + if (managedFoldersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + ensureManagedFoldersIsMutable(); + managedFolders_.add(index, value); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(index, value); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders( + com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addManagedFolders( + int index, com.google.storage.control.v2.ManagedFolder.Builder builderForValue) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.add(index, builderForValue.build()); + onChanged(); + } else { + managedFoldersBuilder_.addMessage(index, builderForValue.build()); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder addAllManagedFolders( + java.lang.Iterable values) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + com.google.protobuf.AbstractMessageLite.Builder.addAll(values, managedFolders_); + onChanged(); + } else { + managedFoldersBuilder_.addAllMessages(values); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder clearManagedFolders() { + if (managedFoldersBuilder_ == null) { + managedFolders_ = java.util.Collections.emptyList(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + } else { + managedFoldersBuilder_.clear(); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public Builder removeManagedFolders(int index) { + if (managedFoldersBuilder_ == null) { + ensureManagedFoldersIsMutable(); + managedFolders_.remove(index); + onChanged(); + } else { + managedFoldersBuilder_.remove(index); + } + return this; + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder getManagedFoldersBuilder(int index) { + return getManagedFoldersFieldBuilder().getBuilder(index); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder( + int index) { + if (managedFoldersBuilder_ == null) { + return managedFolders_.get(index); + } else { + return managedFoldersBuilder_.getMessageOrBuilder(index); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List + getManagedFoldersOrBuilderList() { + if (managedFoldersBuilder_ != null) { + return managedFoldersBuilder_.getMessageOrBuilderList(); + } else { + return java.util.Collections.unmodifiableList(managedFolders_); + } + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder addManagedFoldersBuilder() { + return getManagedFoldersFieldBuilder() + .addBuilder(com.google.storage.control.v2.ManagedFolder.getDefaultInstance()); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public com.google.storage.control.v2.ManagedFolder.Builder addManagedFoldersBuilder(int index) { + return getManagedFoldersFieldBuilder() + .addBuilder(index, com.google.storage.control.v2.ManagedFolder.getDefaultInstance()); + } + /** + * + * + *
        +     * The list of matching managed folders
        +     * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + public java.util.List + getManagedFoldersBuilderList() { + return getManagedFoldersFieldBuilder().getBuilderList(); + } + + private com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder> + getManagedFoldersFieldBuilder() { + if (managedFoldersBuilder_ == null) { + managedFoldersBuilder_ = + new com.google.protobuf.RepeatedFieldBuilderV3< + com.google.storage.control.v2.ManagedFolder, + com.google.storage.control.v2.ManagedFolder.Builder, + com.google.storage.control.v2.ManagedFolderOrBuilder>( + managedFolders_, + ((bitField0_ & 0x00000001) != 0), + getParentForChildren(), + isClean()); + managedFolders_ = null; + } + return managedFoldersBuilder_; + } + + private java.lang.Object nextPageToken_ = ""; + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + public java.lang.String getNextPageToken() { + java.lang.Object ref = nextPageToken_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + nextPageToken_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + public com.google.protobuf.ByteString getNextPageTokenBytes() { + java.lang.Object ref = nextPageToken_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + nextPageToken_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @param value The nextPageToken to set. + * @return This builder for chaining. + */ + public Builder setNextPageToken(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + nextPageToken_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @return This builder for chaining. + */ + public Builder clearNextPageToken() { + nextPageToken_ = getDefaultInstance().getNextPageToken(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + /** + * + * + *
        +     * The continuation token, used to page through large result sets. Provide
        +     * this value in a subsequent request to return the next page of results.
        +     * 
        + * + * string next_page_token = 2; + * + * @param value The bytes for nextPageToken to set. + * @return This builder for chaining. + */ + public Builder setNextPageTokenBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + nextPageToken_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ListManagedFoldersResponse) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ListManagedFoldersResponse) + private static final com.google.storage.control.v2.ListManagedFoldersResponse DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ListManagedFoldersResponse(); + } + + public static com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ListManagedFoldersResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ListManagedFoldersResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java new file mode 100644 index 0000000000..322c36b639 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListManagedFoldersResponseOrBuilder.java @@ -0,0 +1,105 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ListManagedFoldersResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ListManagedFoldersResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + java.util.List getManagedFoldersList(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + com.google.storage.control.v2.ManagedFolder getManagedFolders(int index); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + int getManagedFoldersCount(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + java.util.List + getManagedFoldersOrBuilderList(); + /** + * + * + *
        +   * The list of matching managed folders
        +   * 
        + * + * repeated .google.storage.control.v2.ManagedFolder managed_folders = 1; + */ + com.google.storage.control.v2.ManagedFolderOrBuilder getManagedFoldersOrBuilder(int index); + + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The nextPageToken. + */ + java.lang.String getNextPageToken(); + /** + * + * + *
        +   * The continuation token, used to page through large result sets. Provide
        +   * this value in a subsequent request to return the next page of results.
        +   * 
        + * + * string next_page_token = 2; + * + * @return The bytes for nextPageToken. + */ + com.google.protobuf.ByteString getNextPageTokenBytes(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java new file mode 100644 index 0000000000..86435b6650 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolder.java @@ -0,0 +1,1320 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +/** + * + * + *
        + * A managed folder.
        + * 
        + * + * Protobuf type {@code google.storage.control.v2.ManagedFolder} + */ +public final class ManagedFolder extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.storage.control.v2.ManagedFolder) + ManagedFolderOrBuilder { + private static final long serialVersionUID = 0L; + // Use ManagedFolder.newBuilder() to construct. + private ManagedFolder(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private ManagedFolder() { + name_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new ManagedFolder(); + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ManagedFolder.class, + com.google.storage.control.v2.ManagedFolder.Builder.class); + } + + private int bitField0_; + public static final int NAME_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object name_ = ""; + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + @java.lang.Override + public java.lang.String getName() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } + } + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + @java.lang.Override + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int METAGENERATION_FIELD_NUMBER = 3; + private long metageneration_ = 0L; + /** + * + * + *
        +   * Output only. The metadata version of this managed folder. It increases
        +   * whenever the metadata is updated. Used for preconditions and for detecting
        +   * changes in metadata. Managed folders don't have a generation number.
        +   * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + @java.lang.Override + public long getMetageneration() { + return metageneration_; + } + + public static final int CREATE_TIME_FIELD_NUMBER = 4; + private com.google.protobuf.Timestamp createTime_; + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + @java.lang.Override + public boolean hasCreateTime() { + return ((bitField0_ & 0x00000001) != 0); + } + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getCreateTime() { + return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_; + } + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() { + return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_; + } + + public static final int UPDATE_TIME_FIELD_NUMBER = 5; + private com.google.protobuf.Timestamp updateTime_; + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + @java.lang.Override + public boolean hasUpdateTime() { + return ((bitField0_ & 0x00000002) != 0); + } + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getUpdateTime() { + return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_; + } + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { + return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, name_); + } + if (metageneration_ != 0L) { + output.writeInt64(3, metageneration_); + } + if (((bitField0_ & 0x00000001) != 0)) { + output.writeMessage(4, getCreateTime()); + } + if (((bitField0_ & 0x00000002) != 0)) { + output.writeMessage(5, getUpdateTime()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(name_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, name_); + } + if (metageneration_ != 0L) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(3, metageneration_); + } + if (((bitField0_ & 0x00000001) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(4, getCreateTime()); + } + if (((bitField0_ & 0x00000002) != 0)) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(5, getUpdateTime()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.storage.control.v2.ManagedFolder)) { + return super.equals(obj); + } + com.google.storage.control.v2.ManagedFolder other = + (com.google.storage.control.v2.ManagedFolder) obj; + + if (!getName().equals(other.getName())) return false; + if (getMetageneration() != other.getMetageneration()) return false; + if (hasCreateTime() != other.hasCreateTime()) return false; + if (hasCreateTime()) { + if (!getCreateTime().equals(other.getCreateTime())) return false; + } + if (hasUpdateTime() != other.hasUpdateTime()) return false; + if (hasUpdateTime()) { + if (!getUpdateTime().equals(other.getUpdateTime())) return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + NAME_FIELD_NUMBER; + hash = (53 * hash) + getName().hashCode(); + hash = (37 * hash) + METAGENERATION_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getMetageneration()); + if (hasCreateTime()) { + hash = (37 * hash) + CREATE_TIME_FIELD_NUMBER; + hash = (53 * hash) + getCreateTime().hashCode(); + } + if (hasUpdateTime()) { + hash = (37 * hash) + UPDATE_TIME_FIELD_NUMBER; + hash = (53 * hash) + getUpdateTime().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.storage.control.v2.ManagedFolder parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.storage.control.v2.ManagedFolder prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * + * + *
        +   * A managed folder.
        +   * 
        + * + * Protobuf type {@code google.storage.control.v2.ManagedFolder} + */ + public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.storage.control.v2.ManagedFolder) + com.google.storage.control.v2.ManagedFolderOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.storage.control.v2.ManagedFolder.class, + com.google.storage.control.v2.ManagedFolder.Builder.class); + } + + // Construct using com.google.storage.control.v2.ManagedFolder.newBuilder() + private Builder() { + maybeForceBuilderInitialization(); + } + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + maybeForceBuilderInitialization(); + } + + private void maybeForceBuilderInitialization() { + if (com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders) { + getCreateTimeFieldBuilder(); + getUpdateTimeFieldBuilder(); + } + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + name_ = ""; + metageneration_ = 0L; + createTime_ = null; + if (createTimeBuilder_ != null) { + createTimeBuilder_.dispose(); + createTimeBuilder_ = null; + } + updateTime_ = null; + if (updateTimeBuilder_ != null) { + updateTimeBuilder_.dispose(); + updateTimeBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.storage.control.v2.StorageControlProto + .internal_static_google_storage_control_v2_ManagedFolder_descriptor; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getDefaultInstanceForType() { + return com.google.storage.control.v2.ManagedFolder.getDefaultInstance(); + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder build() { + com.google.storage.control.v2.ManagedFolder result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder buildPartial() { + com.google.storage.control.v2.ManagedFolder result = + new com.google.storage.control.v2.ManagedFolder(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.storage.control.v2.ManagedFolder result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.name_ = name_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.metageneration_ = metageneration_; + } + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000004) != 0)) { + result.createTime_ = createTimeBuilder_ == null ? createTime_ : createTimeBuilder_.build(); + to_bitField0_ |= 0x00000001; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.updateTime_ = updateTimeBuilder_ == null ? updateTime_ : updateTimeBuilder_.build(); + to_bitField0_ |= 0x00000002; + } + result.bitField0_ |= to_bitField0_; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.storage.control.v2.ManagedFolder) { + return mergeFrom((com.google.storage.control.v2.ManagedFolder) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.storage.control.v2.ManagedFolder other) { + if (other == com.google.storage.control.v2.ManagedFolder.getDefaultInstance()) return this; + if (!other.getName().isEmpty()) { + name_ = other.name_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.getMetageneration() != 0L) { + setMetageneration(other.getMetageneration()); + } + if (other.hasCreateTime()) { + mergeCreateTime(other.getCreateTime()); + } + if (other.hasUpdateTime()) { + mergeUpdateTime(other.getUpdateTime()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + name_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 24: + { + metageneration_ = input.readInt64(); + bitField0_ |= 0x00000002; + break; + } // case 24 + case 34: + { + input.readMessage(getCreateTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000004; + break; + } // case 34 + case 42: + { + input.readMessage(getUpdateTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000008; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object name_ = ""; + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + public java.lang.String getName() { + java.lang.Object ref = name_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + name_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + public com.google.protobuf.ByteString getNameBytes() { + java.lang.Object ref = name_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + name_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @param value The name to set. + * @return This builder for chaining. + */ + public Builder setName(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return This builder for chaining. + */ + public Builder clearName() { + name_ = getDefaultInstance().getName(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + /** + * + * + *
        +     * Identifier. The name of this managed folder.
        +     * Format:
        +     * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +     * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @param value The bytes for name to set. + * @return This builder for chaining. + */ + public Builder setNameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + name_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private long metageneration_; + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + @java.lang.Override + public long getMetageneration() { + return metageneration_; + } + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @param value The metageneration to set. + * @return This builder for chaining. + */ + public Builder setMetageneration(long value) { + + metageneration_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The metadata version of this managed folder. It increases
        +     * whenever the metadata is updated. Used for preconditions and for detecting
        +     * changes in metadata. Managed folders don't have a generation number.
        +     * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return This builder for chaining. + */ + public Builder clearMetageneration() { + bitField0_ = (bitField0_ & ~0x00000002); + metageneration_ = 0L; + onChanged(); + return this; + } + + private com.google.protobuf.Timestamp createTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + createTimeBuilder_; + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + public boolean hasCreateTime() { + return ((bitField0_ & 0x00000004) != 0); + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + public com.google.protobuf.Timestamp getCreateTime() { + if (createTimeBuilder_ == null) { + return createTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : createTime_; + } else { + return createTimeBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setCreateTime(com.google.protobuf.Timestamp value) { + if (createTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + createTime_ = value; + } else { + createTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setCreateTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (createTimeBuilder_ == null) { + createTime_ = builderForValue.build(); + } else { + createTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder mergeCreateTime(com.google.protobuf.Timestamp value) { + if (createTimeBuilder_ == null) { + if (((bitField0_ & 0x00000004) != 0) + && createTime_ != null + && createTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getCreateTimeBuilder().mergeFrom(value); + } else { + createTime_ = value; + } + } else { + createTimeBuilder_.mergeFrom(value); + } + if (createTime_ != null) { + bitField0_ |= 0x00000004; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder clearCreateTime() { + bitField0_ = (bitField0_ & ~0x00000004); + createTime_ = null; + if (createTimeBuilder_ != null) { + createTimeBuilder_.dispose(); + createTimeBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.Timestamp.Builder getCreateTimeBuilder() { + bitField0_ |= 0x00000004; + onChanged(); + return getCreateTimeFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() { + if (createTimeBuilder_ != null) { + return createTimeBuilder_.getMessageOrBuilder(); + } else { + return createTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : createTime_; + } + } + /** + * + * + *
        +     * Output only. The creation time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getCreateTimeFieldBuilder() { + if (createTimeBuilder_ == null) { + createTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getCreateTime(), getParentForChildren(), isClean()); + createTime_ = null; + } + return createTimeBuilder_; + } + + private com.google.protobuf.Timestamp updateTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + updateTimeBuilder_; + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + public boolean hasUpdateTime() { + return ((bitField0_ & 0x00000008) != 0); + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + public com.google.protobuf.Timestamp getUpdateTime() { + if (updateTimeBuilder_ == null) { + return updateTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : updateTime_; + } else { + return updateTimeBuilder_.getMessage(); + } + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setUpdateTime(com.google.protobuf.Timestamp value) { + if (updateTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + updateTime_ = value; + } else { + updateTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder setUpdateTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (updateTimeBuilder_ == null) { + updateTime_ = builderForValue.build(); + } else { + updateTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder mergeUpdateTime(com.google.protobuf.Timestamp value) { + if (updateTimeBuilder_ == null) { + if (((bitField0_ & 0x00000008) != 0) + && updateTime_ != null + && updateTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getUpdateTimeBuilder().mergeFrom(value); + } else { + updateTime_ = value; + } + } else { + updateTimeBuilder_.mergeFrom(value); + } + if (updateTime_ != null) { + bitField0_ |= 0x00000008; + onChanged(); + } + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public Builder clearUpdateTime() { + bitField0_ = (bitField0_ & ~0x00000008); + updateTime_ = null; + if (updateTimeBuilder_ != null) { + updateTimeBuilder_.dispose(); + updateTimeBuilder_ = null; + } + onChanged(); + return this; + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.Timestamp.Builder getUpdateTimeBuilder() { + bitField0_ |= 0x00000008; + onChanged(); + return getUpdateTimeFieldBuilder().getBuilder(); + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() { + if (updateTimeBuilder_ != null) { + return updateTimeBuilder_.getMessageOrBuilder(); + } else { + return updateTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : updateTime_; + } + } + /** + * + * + *
        +     * Output only. The modification time of the managed folder.
        +     * 
        + * + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getUpdateTimeFieldBuilder() { + if (updateTimeBuilder_ == null) { + updateTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getUpdateTime(), getParentForChildren(), isClean()); + updateTime_ = null; + } + return updateTimeBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.storage.control.v2.ManagedFolder) + } + + // @@protoc_insertion_point(class_scope:google.storage.control.v2.ManagedFolder) + private static final com.google.storage.control.v2.ManagedFolder DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.storage.control.v2.ManagedFolder(); + } + + public static com.google.storage.control.v2.ManagedFolder getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public ManagedFolder parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.storage.control.v2.ManagedFolder getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java new file mode 100644 index 0000000000..a8251fc222 --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderName.java @@ -0,0 +1,227 @@ +/* + * Copyright 2024 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 + * + * https://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.google.storage.control.v2; + +import com.google.api.pathtemplate.PathTemplate; +import com.google.api.resourcenames.ResourceName; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import javax.annotation.Generated; + +// AUTO-GENERATED DOCUMENTATION AND CLASS. +@Generated("by gapic-generator-java") +public class ManagedFolderName implements ResourceName { + private static final PathTemplate PROJECT_BUCKET_MANAGEDFOLDER = + PathTemplate.createWithoutUrlEncoding( + "projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}"); + private volatile Map fieldValuesMap; + private final String project; + private final String bucket; + private final String managedFolder; + + @Deprecated + protected ManagedFolderName() { + project = null; + bucket = null; + managedFolder = null; + } + + private ManagedFolderName(Builder builder) { + project = Preconditions.checkNotNull(builder.getProject()); + bucket = Preconditions.checkNotNull(builder.getBucket()); + managedFolder = Preconditions.checkNotNull(builder.getManagedFolder()); + } + + public String getProject() { + return project; + } + + public String getBucket() { + return bucket; + } + + public String getManagedFolder() { + return managedFolder; + } + + public static Builder newBuilder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder(this); + } + + public static ManagedFolderName of(String project, String bucket, String managedFolder) { + return newBuilder() + .setProject(project) + .setBucket(bucket) + .setManagedFolder(managedFolder) + .build(); + } + + public static String format(String project, String bucket, String managedFolder) { + return newBuilder() + .setProject(project) + .setBucket(bucket) + .setManagedFolder(managedFolder) + .build() + .toString(); + } + + public static ManagedFolderName parse(String formattedString) { + if (formattedString.isEmpty()) { + return null; + } + Map matchMap = + PROJECT_BUCKET_MANAGEDFOLDER.validatedMatch( + formattedString, "ManagedFolderName.parse: formattedString not in valid format"); + return of(matchMap.get("project"), matchMap.get("bucket"), matchMap.get("managedFolder")); + } + + public static List parseList(List formattedStrings) { + List list = new ArrayList<>(formattedStrings.size()); + for (String formattedString : formattedStrings) { + list.add(parse(formattedString)); + } + return list; + } + + public static List toStringList(List values) { + List list = new ArrayList<>(values.size()); + for (ManagedFolderName value : values) { + if (value == null) { + list.add(""); + } else { + list.add(value.toString()); + } + } + return list; + } + + public static boolean isParsableFrom(String formattedString) { + return PROJECT_BUCKET_MANAGEDFOLDER.matches(formattedString); + } + + @Override + public Map getFieldValuesMap() { + if (fieldValuesMap == null) { + synchronized (this) { + if (fieldValuesMap == null) { + ImmutableMap.Builder fieldMapBuilder = ImmutableMap.builder(); + if (project != null) { + fieldMapBuilder.put("project", project); + } + if (bucket != null) { + fieldMapBuilder.put("bucket", bucket); + } + if (managedFolder != null) { + fieldMapBuilder.put("managedFolder", managedFolder); + } + fieldValuesMap = fieldMapBuilder.build(); + } + } + } + return fieldValuesMap; + } + + public String getFieldValue(String fieldName) { + return getFieldValuesMap().get(fieldName); + } + + @Override + public String toString() { + return PROJECT_BUCKET_MANAGEDFOLDER.instantiate( + "project", project, "bucket", bucket, "managedFolder", managedFolder); + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (o != null && getClass() == o.getClass()) { + ManagedFolderName that = ((ManagedFolderName) o); + return Objects.equals(this.project, that.project) + && Objects.equals(this.bucket, that.bucket) + && Objects.equals(this.managedFolder, that.managedFolder); + } + return false; + } + + @Override + public int hashCode() { + int h = 1; + h *= 1000003; + h ^= Objects.hashCode(project); + h *= 1000003; + h ^= Objects.hashCode(bucket); + h *= 1000003; + h ^= Objects.hashCode(managedFolder); + return h; + } + + /** Builder for projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}. */ + public static class Builder { + private String project; + private String bucket; + private String managedFolder; + + protected Builder() {} + + public String getProject() { + return project; + } + + public String getBucket() { + return bucket; + } + + public String getManagedFolder() { + return managedFolder; + } + + public Builder setProject(String project) { + this.project = project; + return this; + } + + public Builder setBucket(String bucket) { + this.bucket = bucket; + return this; + } + + public Builder setManagedFolder(String managedFolder) { + this.managedFolder = managedFolder; + return this; + } + + private Builder(ManagedFolderName managedFolderName) { + this.project = managedFolderName.project; + this.bucket = managedFolderName.bucket; + this.managedFolder = managedFolderName.managedFolder; + } + + public ManagedFolderName build() { + return new ManagedFolderName(this); + } + } +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java new file mode 100644 index 0000000000..e5d481ae8f --- /dev/null +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ManagedFolderOrBuilder.java @@ -0,0 +1,146 @@ +/* + * Copyright 2024 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 + * + * https://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. + */ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/storage/control/v2/storage_control.proto + +// Protobuf Java Version: 3.25.3 +package com.google.storage.control.v2; + +public interface ManagedFolderOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.storage.control.v2.ManagedFolder) + com.google.protobuf.MessageOrBuilder { + + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The name. + */ + java.lang.String getName(); + /** + * + * + *
        +   * Identifier. The name of this managed folder.
        +   * Format:
        +   * `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}`
        +   * 
        + * + * string name = 1 [(.google.api.field_behavior) = IDENTIFIER]; + * + * @return The bytes for name. + */ + com.google.protobuf.ByteString getNameBytes(); + + /** + * + * + *
        +   * Output only. The metadata version of this managed folder. It increases
        +   * whenever the metadata is updated. Used for preconditions and for detecting
        +   * changes in metadata. Managed folders don't have a generation number.
        +   * 
        + * + * int64 metageneration = 3 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * @return The metageneration. + */ + long getMetageneration(); + + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the createTime field is set. + */ + boolean hasCreateTime(); + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The createTime. + */ + com.google.protobuf.Timestamp getCreateTime(); + /** + * + * + *
        +   * Output only. The creation time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp create_time = 4 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder(); + + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return Whether the updateTime field is set. + */ + boolean hasUpdateTime(); + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + * + * @return The updateTime. + */ + com.google.protobuf.Timestamp getUpdateTime(); + /** + * + * + *
        +   * Output only. The modification time of the managed folder.
        +   * 
        + * + * .google.protobuf.Timestamp update_time = 5 [(.google.api.field_behavior) = OUTPUT_ONLY]; + * + */ + com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder(); +} diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java index d87413bf94..059f96157b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfo.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java index cb6beb5341..5331177419 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PendingRenameInfoOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface PendingRenameInfoOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java index 5b0b33191d..f6cddfa643 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java index 7589a93aee..6af4130aec 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface RenameFolderMetadataOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java index 17472abf8d..46a2ba440c 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java index 9234f04e58..b7799da96b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/RenameFolderRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface RenameFolderRequestOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java index 4d08cb6316..5f8c311a8d 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageControlProto.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public final class StorageControlProto { @@ -84,6 +84,30 @@ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry r internal_static_google_storage_control_v2_GetStorageLayoutRequest_descriptor; static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable internal_static_google_storage_control_v2_GetStorageLayoutRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ManagedFolder_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable; + static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor; + static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable; public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { return descriptor; @@ -171,48 +195,100 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + "ket}/storageLayout\"\206\001\n\027GetStorageLayoutR" + "equest\022:\n\004name\030\001 \001(\tB,\340A\002\372A&\n$storage.go" + "ogleapis.com/StorageLayout\022\016\n\006prefix\030\002 \001" - + "(\t\022\037\n\nrequest_id\030\003 \001(\tB\013\340A\001\342\214\317\327\010\002\010\0012\223\n\n\016" - + "StorageControl\022\232\001\n\014CreateFolder\022..google" - + ".storage.control.v2.CreateFolderRequest\032" - + "!.google.storage.control.v2.Folder\"7\332A\027p" - + "arent,folder,folder_id\212\323\344\223\002\027\022\025\n\006parent\022\013" - + "{bucket=**}\022\217\001\n\014DeleteFolder\022..google.st" - + "orage.control.v2.DeleteFolderRequest\032\026.g" - + "oogle.protobuf.Empty\"7\332A\004name\212\323\344\223\002*\022(\n\004n" - + "ame\022 {bucket=projects/*/buckets/*}/**\022\224\001" - + "\n\tGetFolder\022+.google.storage.control.v2." - + "GetFolderRequest\032!.google.storage.contro" - + "l.v2.Folder\"7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {buc" - + "ket=projects/*/buckets/*}/**\022\224\001\n\013ListFol" - + "ders\022-.google.storage.control.v2.ListFol" - + "dersRequest\032..google.storage.control.v2." - + "ListFoldersResponse\"&\332A\006parent\212\323\344\223\002\027\022\025\n\006" - + "parent\022\013{bucket=**}\022\315\001\n\014RenameFolder\022..g" - + "oogle.storage.control.v2.RenameFolderReq" - + "uest\032\035.google.longrunning.Operation\"n\312A\036" - + "\n\006Folder\022\024RenameFolderMetadata\332A\032name,de" - + "stination_folder_id\212\323\344\223\002*\022(\n\004name\022 {buck" - + "et=projects/*/buckets/*}/**\022\251\001\n\020GetStora" - + "geLayout\0222.google.storage.control.v2.Get" - + "StorageLayoutRequest\032(.google.storage.co" - + "ntrol.v2.StorageLayout\"7\332A\004name\212\323\344\223\002*\022(\n" - + "\004name\022 {bucket=projects/*/buckets/*}/**\032" - + "\247\002\312A\026storage.googleapis.com\322A\212\002https://w" - + "ww.googleapis.com/auth/cloud-platform,ht" - + "tps://www.googleapis.com/auth/cloud-plat" - + "form.read-only,https://www.googleapis.co" - + "m/auth/devstorage.full_control,https://w" - + "ww.googleapis.com/auth/devstorage.read_o" - + "nly,https://www.googleapis.com/auth/devs" - + "torage.read_writeB\264\002\n\035com.google.storage" - + ".control.v2B\023StorageControlProtoP\001ZKclou" - + "d.google.com/go/storage/control/apiv2/st" - + "oragecontrolpb;storagecontrolpb\252\002\037Google" - + ".Cloud.Storage.Control.V2\312\002\037Google\\Cloud" - + "\\Storage\\Control\\V2\352\002#Google::Cloud::Sto" - + "rage::Control::V2\352AD\n\035storage.googleapis" - + ".com/Bucket\022#projects/{project}/buckets/" - + "{bucket}b\006proto3" + + "(\t\022\037\n\nrequest_id\030\003 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001\"\276\002\n\r" + + "ManagedFolder\022\021\n\004name\030\001 \001(\tB\003\340A\010\022\033\n\016meta" + + "generation\030\003 \001(\003B\003\340A\003\0224\n\013create_time\030\004 \001" + + "(\0132\032.google.protobuf.TimestampB\003\340A\003\0224\n\013u" + + "pdate_time\030\005 \001(\0132\032.google.protobuf.Times" + + "tampB\003\340A\003:\220\001\352A\214\001\n$storage.googleapis.com" + + "/ManagedFolder\022Eprojects/{project}/bucke" + + "ts/{bucket}/managedFolders/{managedFolde" + + "r=**}*\016managedFolders2\rmanagedFolder\"\202\002\n" + + "\027GetManagedFolderRequest\022:\n\004name\030\006 \001(\tB," + + "\340A\002\372A&\n$storage.googleapis.com/ManagedFo" + + "lder\022$\n\027if_metageneration_match\030\003 \001(\003H\000\210" + + "\001\001\022(\n\033if_metageneration_not_match\030\004 \001(\003H" + + "\001\210\001\001\022\037\n\nrequest_id\030\005 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001B\032\n" + + "\030_if_metageneration_matchB\036\n\034_if_metagen" + + "eration_not_match\"\342\001\n\032CreateManagedFolde" + + "rRequest\022<\n\006parent\030\001 \001(\tB,\340A\002\372A&\022$storag" + + "e.googleapis.com/ManagedFolder\022E\n\016manage" + + "d_folder\030\002 \001(\0132(.google.storage.control." + + "v2.ManagedFolderB\003\340A\002\022\036\n\021managed_folder_" + + "id\030\003 \001(\tB\003\340A\002\022\037\n\nrequest_id\030\004 \001(\tB\013\340A\001\342\214" + + "\317\327\010\002\010\001\"\236\002\n\032DeleteManagedFolderRequest\022:\n" + + "\004name\030\007 \001(\tB,\340A\002\372A&\n$storage.googleapis." + + "com/ManagedFolder\022$\n\027if_metageneration_m" + + "atch\030\003 \001(\003H\000\210\001\001\022(\n\033if_metageneration_not" + + "_match\030\004 \001(\003H\001\210\001\001\022\027\n\017allow_non_empty\030\005 \001" + + "(\010\022\037\n\nrequest_id\030\006 \001(\tB\013\340A\001\342\214\317\327\010\002\010\001B\032\n\030_" + + "if_metageneration_matchB\036\n\034_if_metagener" + + "ation_not_match\"\300\001\n\031ListManagedFoldersRe" + + "quest\022<\n\006parent\030\001 \001(\tB,\340A\002\372A&\022$storage.g" + + "oogleapis.com/ManagedFolder\022\026\n\tpage_size" + + "\030\002 \001(\005B\003\340A\001\022\027\n\npage_token\030\003 \001(\tB\003\340A\001\022\023\n\006" + + "prefix\030\004 \001(\tB\003\340A\001\022\037\n\nrequest_id\030\005 \001(\tB\013\340" + + "A\001\342\214\317\327\010\002\010\001\"x\n\032ListManagedFoldersResponse" + + "\022A\n\017managed_folders\030\001 \003(\0132(.google.stora" + + "ge.control.v2.ManagedFolder\022\027\n\017next_page" + + "_token\030\002 \001(\t2\315\017\n\016StorageControl\022\232\001\n\014Crea" + + "teFolder\022..google.storage.control.v2.Cre" + + "ateFolderRequest\032!.google.storage.contro" + + "l.v2.Folder\"7\332A\027parent,folder,folder_id\212" + + "\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\217\001\n\014DeleteF" + + "older\022..google.storage.control.v2.Delete" + + "FolderRequest\032\026.google.protobuf.Empty\"7\332" + + "A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=projects/*" + + "/buckets/*}/**\022\224\001\n\tGetFolder\022+.google.st" + + "orage.control.v2.GetFolderRequest\032!.goog" + + "le.storage.control.v2.Folder\"7\332A\004name\212\323\344" + + "\223\002*\022(\n\004name\022 {bucket=projects/*/buckets/" + + "*}/**\022\224\001\n\013ListFolders\022-.google.storage.c" + + "ontrol.v2.ListFoldersRequest\032..google.st" + + "orage.control.v2.ListFoldersResponse\"&\332A" + + "\006parent\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\022\315\001\n" + + "\014RenameFolder\022..google.storage.control.v" + + "2.RenameFolderRequest\032\035.google.longrunni" + + "ng.Operation\"n\312A\036\n\006Folder\022\024RenameFolderM" + + "etadata\332A\032name,destination_folder_id\212\323\344\223" + + "\002*\022(\n\004name\022 {bucket=projects/*/buckets/*" + + "}/**\022\251\001\n\020GetStorageLayout\0222.google.stora" + + "ge.control.v2.GetStorageLayoutRequest\032(." + + "google.storage.control.v2.StorageLayout\"" + + "7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=projects" + + "/*/buckets/*}/**\022\277\001\n\023CreateManagedFolder" + + "\0225.google.storage.control.v2.CreateManag" + + "edFolderRequest\032(.google.storage.control" + + ".v2.ManagedFolder\"G\332A\'parent,managed_fol" + + "der,managed_folder_id\212\323\344\223\002\027\022\025\n\006parent\022\013{" + + "bucket=**}\022\235\001\n\023DeleteManagedFolder\0225.goo" + + "gle.storage.control.v2.DeleteManagedFold" + + "erRequest\032\026.google.protobuf.Empty\"7\332A\004na" + + "me\212\323\344\223\002*\022(\n\004name\022 {bucket=projects/*/buc" + + "kets/*}/**\022\251\001\n\020GetManagedFolder\0222.google" + + ".storage.control.v2.GetManagedFolderRequ" + + "est\032(.google.storage.control.v2.ManagedF" + + "older\"7\332A\004name\212\323\344\223\002*\022(\n\004name\022 {bucket=pr" + + "ojects/*/buckets/*}/**\022\251\001\n\022ListManagedFo" + + "lders\0224.google.storage.control.v2.ListMa" + + "nagedFoldersRequest\0325.google.storage.con" + + "trol.v2.ListManagedFoldersResponse\"&\332A\006p" + + "arent\212\323\344\223\002\027\022\025\n\006parent\022\013{bucket=**}\032\247\002\312A\026" + + "storage.googleapis.com\322A\212\002https://www.go" + + "ogleapis.com/auth/cloud-platform,https:/" + + "/www.googleapis.com/auth/cloud-platform." + + "read-only,https://www.googleapis.com/aut" + + "h/devstorage.full_control,https://www.go" + + "ogleapis.com/auth/devstorage.read_only,h" + + "ttps://www.googleapis.com/auth/devstorag" + + "e.read_writeB\246\002\n\035com.google.storage.cont" + + "rol.v2B\023StorageControlProtoP\001Z=cloud.goo" + + "gle.com/go/storage/control/apiv2/control" + + "pb;controlpb\252\002\037Google.Cloud.Storage.Cont" + + "rol.V2\312\002\037Google\\Cloud\\Storage\\Control\\V2" + + "\352\002#Google::Cloud::Storage::Control::V2\352A" + + "D\n\035storage.googleapis.com/Bucket\022#projec" + + "ts/{project}/buckets/{bucket}b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( @@ -355,6 +431,58 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { new java.lang.String[] { "Name", "Prefix", "RequestId", }); + internal_static_google_storage_control_v2_ManagedFolder_descriptor = + getDescriptor().getMessageTypes().get(12); + internal_static_google_storage_control_v2_ManagedFolder_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ManagedFolder_descriptor, + new java.lang.String[] { + "Name", "Metageneration", "CreateTime", "UpdateTime", + }); + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(13); + internal_static_google_storage_control_v2_GetManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_GetManagedFolderRequest_descriptor, + new java.lang.String[] { + "Name", "IfMetagenerationMatch", "IfMetagenerationNotMatch", "RequestId", + }); + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(14); + internal_static_google_storage_control_v2_CreateManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_CreateManagedFolderRequest_descriptor, + new java.lang.String[] { + "Parent", "ManagedFolder", "ManagedFolderId", "RequestId", + }); + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor = + getDescriptor().getMessageTypes().get(15); + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_DeleteManagedFolderRequest_descriptor, + new java.lang.String[] { + "Name", + "IfMetagenerationMatch", + "IfMetagenerationNotMatch", + "AllowNonEmpty", + "RequestId", + }); + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor = + getDescriptor().getMessageTypes().get(16); + internal_static_google_storage_control_v2_ListManagedFoldersRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ListManagedFoldersRequest_descriptor, + new java.lang.String[] { + "Parent", "PageSize", "PageToken", "Prefix", "RequestId", + }); + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor = + getDescriptor().getMessageTypes().get(17); + internal_static_google_storage_control_v2_ListManagedFoldersResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_storage_control_v2_ListManagedFoldersResponse_descriptor, + new java.lang.String[] { + "ManagedFolders", "NextPageToken", + }); com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance(); registry.add(com.google.api.ClientProto.defaultHost); diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java index 01221716f0..df62a75829 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayout.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; /** diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java index 70994aa721..cc07785db2 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/control/v2/storage_control.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.control.v2; public interface StorageLayoutOrBuilder diff --git a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto index ddc391c5f5..5e460eb9ca 100644 --- a/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto +++ b/proto-google-cloud-storage-control-v2/src/main/proto/google/storage/control/v2/storage_control.proto @@ -26,7 +26,7 @@ import "google/protobuf/empty.proto"; import "google/protobuf/timestamp.proto"; option csharp_namespace = "Google.Cloud.Storage.Control.V2"; -option go_package = "cloud.google.com/go/storage/control/apiv2/storagecontrolpb;storagecontrolpb"; +option go_package = "cloud.google.com/go/storage/control/apiv2/controlpb;controlpb"; option java_multiple_files = true; option java_outer_classname = "StorageControlProto"; option java_package = "com.google.storage.control.v2"; @@ -112,6 +112,47 @@ service StorageControl { }; option (google.api.method_signature) = "name"; } + + // Creates a new managed folder. + rpc CreateManagedFolder(CreateManagedFolderRequest) returns (ManagedFolder) { + option (google.api.routing) = { + routing_parameters { field: "parent" path_template: "{bucket=**}" } + }; + option (google.api.method_signature) = + "parent,managed_folder,managed_folder_id"; + } + + // Permanently deletes an empty managed folder. + rpc DeleteManagedFolder(DeleteManagedFolderRequest) + returns (google.protobuf.Empty) { + option (google.api.routing) = { + routing_parameters { + field: "name" + path_template: "{bucket=projects/*/buckets/*}/**" + } + }; + option (google.api.method_signature) = "name"; + } + + // Returns metadata for the specified managed folder. + rpc GetManagedFolder(GetManagedFolderRequest) returns (ManagedFolder) { + option (google.api.routing) = { + routing_parameters { + field: "name" + path_template: "{bucket=projects/*/buckets/*}/**" + } + }; + option (google.api.method_signature) = "name"; + } + + // Retrieves a list of managed folders for a given bucket. + rpc ListManagedFolders(ListManagedFoldersRequest) + returns (ListManagedFoldersResponse) { + option (google.api.routing) = { + routing_parameters { field: "parent" path_template: "{bucket=**}" } + }; + option (google.api.method_signature) = "parent"; + } } // Contains information about a pending rename operation. @@ -195,7 +236,11 @@ message CreateFolderRequest { // error. Folder folder = 2 [(google.api.field_behavior) = REQUIRED]; - // Required. The absolute path of the folder, using a single `/` as delimiter. + // Required. The full name of a folder, including all its parent folders. + // Folders use single '/' characters as a delimiter. + // The folder_id must end with a slash. + // For example, the folder_id of "books/biographies/" would create a new + // "biographies/" folder under the "books/" folder. string folder_id = 3 [(google.api.field_behavior) = REQUIRED]; // Optional. If true, parent folder doesn't have to be present and all missing @@ -428,3 +473,161 @@ message GetStorageLayoutRequest { (google.api.field_behavior) = OPTIONAL ]; } + +// A managed folder. +message ManagedFolder { + option (google.api.resource) = { + type: "storage.googleapis.com/ManagedFolder" + pattern: "projects/{project}/buckets/{bucket}/managedFolders/{managedFolder=**}" + plural: "managedFolders" + singular: "managedFolder" + }; + + // Identifier. The name of this managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 1 [(google.api.field_behavior) = IDENTIFIER]; + + // Output only. The metadata version of this managed folder. It increases + // whenever the metadata is updated. Used for preconditions and for detecting + // changes in metadata. Managed folders don't have a generation number. + int64 metageneration = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The creation time of the managed folder. + google.protobuf.Timestamp create_time = 4 + [(google.api.field_behavior) = OUTPUT_ONLY]; + + // Output only. The modification time of the managed folder. + google.protobuf.Timestamp update_time = 5 + [(google.api.field_behavior) = OUTPUT_ONLY]; +} + +// Request message for GetManagedFolder. +message GetManagedFolderRequest { + // Required. Name of the managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 6 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // The operation succeeds conditional on the managed folder's current + // metageneration matching the value here specified. + optional int64 if_metageneration_match = 3; + + // The operation succeeds conditional on the managed folder's current + // metageneration NOT matching the value here specified. + optional int64 if_metageneration_not_match = 4; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 5 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Request message for CreateManagedFolder. +message CreateManagedFolderRequest { + // Required. Name of the bucket this managed folder belongs to. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // Required. Properties of the managed folder being created. + // The bucket and managed folder names are specified in the `parent` and + // `managed_folder_id` fields. Populating these fields in `managed_folder` + // will result in an error. + ManagedFolder managed_folder = 2 [(google.api.field_behavior) = REQUIRED]; + + // Required. The name of the managed folder. It uses a single `/` as delimiter + // and leading and trailing `/` are allowed. + string managed_folder_id = 3 [(google.api.field_behavior) = REQUIRED]; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 4 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// DeleteManagedFolder RPC request message. +message DeleteManagedFolderRequest { + // Required. Name of the managed folder. + // Format: + // `projects/{project}/buckets/{bucket}/managedFolders/{managedFolder}` + string name = 7 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // The operation succeeds conditional on the managed folder's current + // metageneration matching the value here specified. + optional int64 if_metageneration_match = 3; + + // The operation succeeds conditional on the managed folder's current + // metageneration NOT matching the value here specified. + optional int64 if_metageneration_not_match = 4; + + // Allows deletion of a managed folder even if it is not empty. + // A managed folder is empty if it manages no child managed folders or + // objects. Caller must have permission for + // storage.managedFolders.setIamPolicy. + bool allow_non_empty = 5; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 6 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Request message for ListManagedFolders. +message ListManagedFoldersRequest { + // Required. Name of the bucket this managed folder belongs to. + string parent = 1 [ + (google.api.field_behavior) = REQUIRED, + (google.api.resource_reference) = { + child_type: "storage.googleapis.com/ManagedFolder" + } + ]; + + // Optional. Maximum number of managed folders to return in a single response. + // The service will use this parameter or 1,000 items, whichever is smaller. + int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A previously-returned page token representing part of the larger + // set of results to view. + string page_token = 3 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. Filter results to match managed folders with name starting with + // this prefix. + string prefix = 4 [(google.api.field_behavior) = OPTIONAL]; + + // Optional. A unique identifier for this request. UUID is the recommended + // format, but other formats are still accepted. + string request_id = 5 [ + (google.api.field_info).format = UUID4, + (google.api.field_behavior) = OPTIONAL + ]; +} + +// Response message for ListManagedFolders. +message ListManagedFoldersResponse { + // The list of matching managed folders + repeated ManagedFolder managed_folders = 1; + + // The continuation token, used to page through large result sets. Provide + // this value in a subsequent request to return the next page of results. + string next_page_token = 2; +} diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index 1088d2ae7e..6b73749779 100644 --- a/proto-google-cloud-storage-v2/pom.xml +++ b/proto-google-cloud-storage-v2/pom.xml @@ -4,13 +4,13 @@ 4.0.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.36.1-alpha + 2.37.0-alpha proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java index 966db3096c..910d25b01d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java index 25eb60d126..0277e95f72 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BidiWriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java index ecc93d8293..c101557ed6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java index 4677316445..528a442896 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BidiWriteObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java index 347b9632a6..67a5df95bd 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Bucket.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java index ec3a58fb93..b2c6ce1a8f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControl.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java index a9828d2239..2c2582831a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketAccessControlOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BucketAccessControlOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java index 8c6c315be4..d404726a3b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface BucketOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java index 14f0654359..665a6bd9e7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java index 1b091899fb..7f147ed6b6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CancelResumableWriteRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java index 611ce5d0bf..520b8eafae 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java index 12713bdba6..ba03212461 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CancelResumableWriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CancelResumableWriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java index 02cf2fd73c..824ba38894 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedData.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java index e2e6c5f2c4..d5199d01d6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ChecksummedDataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ChecksummedDataOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java index 5083977e8c..52a536ab54 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParams.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java index 9e125a682f..8232fa50e7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CommonObjectRequestParamsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CommonObjectRequestParamsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java index f8e6e75e34..c400203b53 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java index 4c5fad6de5..1eaa01f1a3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ComposeObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ComposeObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java index 354a5e6eb4..98a1721113 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRange.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java index f85ddc28df..d4cf266f8e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ContentRangeOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ContentRangeOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java index 95f1d7555a..8c1eed4745 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java index 34ac8754dd..32fa4e23d6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java index b7fb2a1e4a..278b0bee55 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java index 6e190c0126..df1e6b8135 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java index 15ecdafe29..4e763b462c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java index efa4aa0ba4..1b0ca68d84 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateHmacKeyResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateHmacKeyResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java index 8d7c5bb8d2..32583d678c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java index 7b4ec70aaf..fb106cbd0d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CreateNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CreateNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java index d6f5da1d26..9c12a01357 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryption.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java index 9822f680ac..dea3c58a16 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CustomerEncryptionOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface CustomerEncryptionOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java index d47d6858f1..a41ce6b14a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java index c62cc0d345..e16f379ea9 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java index 03efca0bdf..f424f3e660 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java index 0bcff6a226..25f792bd18 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java index b0a1229387..3ed33c9ef2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java index 34c0255038..c0b97b8da3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java index 7a512521b9..225ab6115b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java index ff1b26eeac..26265c14dc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/DeleteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface DeleteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java index 7c221513b4..e436ba6cfc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java index 322ff10644..0a797f87ca 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java index 49a48fe993..1ac5037e16 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java index 634982db7d..810b54f45a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java index f7eddbb181..ac58e69583 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java index 5e9802702c..722654bff8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetNotificationConfigRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetNotificationConfigRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java index f4efc51529..383c4f611c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java index ecf25653e8..3c9d4e4b29 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java index 3819b8d186..103bc4a558 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java index 63891d701f..9d883a5127 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/GetServiceAccountRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface GetServiceAccountRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java index 4f6c090d26..08557a21b6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadata.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java index 0070c3beec..10537fa671 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/HmacKeyMetadataOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface HmacKeyMetadataOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java index 80ed57b2e8..3f0459ea2d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java index e0f513de62..57c83288a6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListBucketsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java index 479d8e5004..9f3b2e621e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java index ba54e45019..d097829222 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListBucketsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListBucketsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java index 4bb92e4bb8..833ed56d45 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java index 7b98cab439..170f169364 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListHmacKeysRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java index 6d7469ac8a..54344d68a8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java index bb0e3da58b..994e550681 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListHmacKeysResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListHmacKeysResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java index 191a58ee0b..199bc95e08 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java index 6b7b7789d7..1c08d45143 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListNotificationConfigsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java index 71040f24c0..9e0c00e9ae 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java index 04a105ca44..ee7634c0bc 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListNotificationConfigsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListNotificationConfigsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java index 22ec3b58ea..ddb575f2ac 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java index 215d9afc59..6abda60794 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListObjectsRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java index 0e845ba1dc..392f5c5cc9 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java index 36d17c565d..ef5e82b8a3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ListObjectsResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ListObjectsResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java index f3a53269d0..f866fcaa34 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java index 889ceb8ff6..8c9b7e67c8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/LockBucketRetentionPolicyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface LockBucketRetentionPolicyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java index 0a0e5a5951..479b8ffb2b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfig.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java index 8133f4e80e..56cb9e6c3b 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/NotificationConfigOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface NotificationConfigOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java index 13e834eb36..7e4d6f90d4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Object.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java index 89f0076a9b..6a56338b5a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControl.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java index 5c9a4196d5..11e3909aa4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectAccessControlOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectAccessControlOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java index b14c58b699..6a515e0597 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksums.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java index 27c07d87c2..f58e290a93 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectChecksumsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectChecksumsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java index db5ea2166c..62f72c138e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ObjectOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java index 3cf0d0396c..9a6afaf97e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/Owner.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java index 60155b5978..d9a742fd5f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/OwnerOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface OwnerOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java index d7d6fc4372..0f512e2c72 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeam.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java index 4fc6b346e6..39317d44ea 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectTeamOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ProjectTeamOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java index 6f3c4cce6f..bed16901c3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java index c35bb3baf0..055478ae9f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface QueryWriteStatusRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java index 61ee8a83d9..b71c9d45ac 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java index 3ba839ad5d..f3a139e588 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/QueryWriteStatusResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface QueryWriteStatusResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java index be84b61983..55778a11fd 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java index 432a4da5d9..94ad9c8236 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ReadObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java index 8af403a236..e86769077a 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java index 1ba816a2f9..b57255da69 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ReadObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java index af68901a65..c01c3d744d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java index 9fcc63edbf..b7f8a0f18e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RestoreObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RestoreObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java index 45d3cd237d..d5aaa957b4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java index 923f2eea74..2ea2851176 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RewriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java index 8ffa674ddb..2e6aaf6873 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java index b45f32bdd7..47a97cacb2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/RewriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface RewriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java index b992bbe7a6..775517f952 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccount.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java index 662e2e777c..835c27b6af 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceAccountOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ServiceAccountOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java index 87cd402171..ebe87b2582 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstants.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java index c187cdb996..db818ba878 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ServiceConstantsOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface ServiceConstantsOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java index 88f4236f57..626db2a07d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java index 51cc325add..1d1a842a25 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface StartResumableWriteRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java index d9502fbca9..a1fda1a6ca 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java index 3172451eb7..d0ec115de3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StartResumableWriteResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface StartResumableWriteResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java index fab5bd6825..caa3bf077d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageProto.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public final class StorageProto { diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java index 30f7424aa0..85cd112fc2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java index 67e1b64cbc..98179a9935 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateBucketRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateBucketRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java index cdf494ccd7..b6f06d1fe1 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java index 7a14645ccf..8683e6816d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateHmacKeyRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateHmacKeyRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java index fe7c51344a..f1583c5781 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java index 24446a84b7..962d3e3881 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/UpdateObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface UpdateObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java index 9071cfe9d9..aeabc66494 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequest.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java index f0efb8f1ac..fd2a6639a1 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectRequestOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectRequestOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java index 5ae8dc20e6..b01fd73775 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponse.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java index 55ffac3007..536ca8263e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectResponseOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectResponseOrBuilder diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java index 0aad6e0eb9..867a6ade1d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpec.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; /** diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java index 8643b90e81..6c0bdb6b6f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/WriteObjectSpecOrBuilder.java @@ -16,7 +16,7 @@ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: google/storage/v2/storage.proto -// Protobuf Java Version: 3.25.2 +// Protobuf Java Version: 3.25.3 package com.google.storage.v2; public interface WriteObjectSpecOrBuilder diff --git a/renovate.json b/renovate.json index 78317cace2..23d26dbaa6 100644 --- a/renovate.json +++ b/renovate.json @@ -20,6 +20,15 @@ "matchStrings": ["value: \"gcr.io/cloud-devrel-public-resources/graalvm.*:(?.*?)\""], "depNameTemplate": "com.google.cloud:sdk-platform-java-config", "datasourceTemplate": "maven" + }, + { + "customType": "regex", + "fileMatch": [ + "^.github/workflows/unmanaged_dependency_check.yaml$" + ], + "matchStrings": ["uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v(?.+?)\\n"], + "depNameTemplate": "com.google.cloud:sdk-platform-java-config", + "datasourceTemplate": "maven" } ], "packageRules": [ diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index ef39f8723b..f982806546 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,7 +30,12 @@ com.google.cloud google-cloud-storage - 2.36.0 + 2.36.1 + + + com.google.cloud + google-cloud-storage-control + 2.37.0 @@ -61,9 +66,15 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.129.0 test + + com.google.cloud + google-cloud-storage-control + 2.36.1-alpha + compile + diff --git a/samples/native-image-sample/pom.xml b/samples/native-image-sample/pom.xml index 2f4f14a4b7..601761caf8 100644 --- a/samples/native-image-sample/pom.xml +++ b/samples/native-image-sample/pom.xml @@ -29,7 +29,7 @@ com.google.cloud libraries-bom - 26.34.0 + 26.37.0 pom import @@ -61,9 +61,15 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.129.0 test + + com.google.cloud + google-cloud-storage-control + 2.37.0 + compile +
        @@ -72,7 +78,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.3.0 + 3.4.0 diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index 5ba9276aa2..617edd0c02 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,7 +28,13 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.37.0 + + + com.google.cloud + google-cloud-storage-control + 2.37.0 + compile @@ -52,7 +58,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.129.0 test
        diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index b9c0b93c99..e798300176 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -31,7 +31,7 @@ com.google.cloud libraries-bom - 26.34.0 + 26.37.0 pom import @@ -43,6 +43,10 @@ com.google.cloud google-cloud-storage + + com.google.cloud + google-cloud-storage-control + @@ -72,7 +76,7 @@ com.google.cloud google-cloud-pubsub - 1.127.2 + 1.129.0 test diff --git a/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java new file mode 100644 index 0000000000..28ad20d183 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/QuickstartStorageControlSample.java @@ -0,0 +1,41 @@ +/* + * Copyright 2024 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; + +// [START storage_control_quickstart_sample] +import com.google.storage.control.v2.GetStorageLayoutRequest; +import com.google.storage.control.v2.StorageControlClient; +import com.google.storage.control.v2.StorageLayout; +import com.google.storage.control.v2.StorageLayoutName; + +public class QuickstartStorageControlSample { + public static void main(String... args) throws Exception { + String bucketName = args[0]; // "your-bucket-name"; + + // Instantiates a client in a try-with-resource to automatically cleanup underlying resources + try (StorageControlClient storageControlClient = StorageControlClient.create()) { + GetStorageLayoutRequest request = + GetStorageLayoutRequest.newBuilder() + // Set project to "_" to signify global bucket + .setName(StorageLayoutName.format("_", bucketName)) + .build(); + StorageLayout response = storageControlClient.getStorageLayout(request); + System.out.printf("Performed getStorageLayout request for %s", response.getName()); + } + } +} +// [END storage_control_quickstart_sample] diff --git a/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java b/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java index e0190ee85a..98d0020200 100644 --- a/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java +++ b/samples/snippets/src/main/java/com/example/storage/object/UploadObjectFromMemory.java @@ -22,7 +22,6 @@ import com.google.cloud.storage.BlobInfo; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -45,7 +44,25 @@ public static void uploadObjectFromMemory( BlobId blobId = BlobId.of(bucketName, objectName); BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build(); byte[] content = contents.getBytes(StandardCharsets.UTF_8); - storage.createFrom(blobInfo, new ByteArrayInputStream(content)); + + // Optional: set a generation-match precondition to enable automatic retries, avoid potential + // race + // conditions and data corruptions. The request returns a 412 error if the + // preconditions are not met. + Storage.BlobTargetOption precondition; + if (storage.get(bucketName, objectName) == null) { + // For a target object that does not yet exist, set the DoesNotExist precondition. + // This will cause the request to fail if the object is created before the request runs. + precondition = Storage.BlobTargetOption.doesNotExist(); + } else { + // If the destination already exists in your bucket, instead set a generation-match + // precondition. This will cause the request to fail if the existing object's generation + // changes before the request runs. + precondition = + Storage.BlobTargetOption.generationMatch( + storage.get(bucketName, objectName).getGeneration()); + } + storage.create(blobInfo, content, precondition); System.out.println( "Object " diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java new file mode 100644 index 0000000000..b77a6fee67 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadBucket.java @@ -0,0 +1,61 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_download_bucket] +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; +import com.google.cloud.storage.transfermanager.DownloadResult; +import com.google.cloud.storage.transfermanager.ParallelDownloadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; + +class DownloadBucket { + + public static void downloadBucketContents( + String projectId, String bucketName, Path destinationDirectory) { + Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService(); + List blobs = + storage + .list(bucketName) + .streamAll() + .map(blob -> blob.asBlobInfo()) + .collect(Collectors.toList()); + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelDownloadConfig parallelDownloadConfig = + ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); + + List results = + transferManager.downloadBlobs(blobs, parallelDownloadConfig).getDownloadResults(); + + for (DownloadResult result : results) { + System.out.println( + "Download of " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); + } + } +} +// [END storage_transfer_manager_download_bucket] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java new file mode 100644 index 0000000000..aae4d80596 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/DownloadMany.java @@ -0,0 +1,52 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_download_many] +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.transfermanager.DownloadResult; +import com.google.cloud.storage.transfermanager.ParallelDownloadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import java.nio.file.Path; +import java.util.List; + +class DownloadMany { + + public static void downloadManyBlobs( + String bucketName, List blobs, Path destinationDirectory) { + + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelDownloadConfig parallelDownloadConfig = + ParallelDownloadConfig.newBuilder() + .setBucketName(bucketName) + .setDownloadDirectory(destinationDirectory) + .build(); + + List results = + transferManager.downloadBlobs(blobs, parallelDownloadConfig).getDownloadResults(); + + for (DownloadResult result : results) { + System.out.println( + "Download of " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); + } + } +} +// [END storage_transfer_manager_download_many] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java new file mode 100644 index 0000000000..0a14bec049 --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadDirectory.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_upload_directory] +import com.google.cloud.storage.transfermanager.ParallelUploadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import com.google.cloud.storage.transfermanager.UploadResult; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +class UploadDirectory { + + public static void uploadDirectoryContents(String bucketName, Path sourceDirectory) + throws IOException { + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucketName).build(); + + // Create a list to store the file paths + List filePaths = new ArrayList<>(); + // Get all files in the directory + // try-with-resource to ensure pathStream is closed + try (Stream pathStream = Files.walk(sourceDirectory)) { + pathStream.filter(Files::isRegularFile).forEach(filePaths::add); + } + List results = + transferManager.uploadFiles(filePaths, parallelUploadConfig).getUploadResults(); + for (UploadResult result : results) { + System.out.println( + "Upload for " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); + } + } +} +// [END storage_transfer_manager_upload_directory] diff --git a/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java new file mode 100644 index 0000000000..b477f87bdd --- /dev/null +++ b/samples/snippets/src/main/java/com/example/storage/transfermanager/UploadMany.java @@ -0,0 +1,45 @@ +/* + * Copyright 2024 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.transfermanager; + +// [START storage_transfer_manager_upload_many] +import com.google.cloud.storage.transfermanager.ParallelUploadConfig; +import com.google.cloud.storage.transfermanager.TransferManager; +import com.google.cloud.storage.transfermanager.TransferManagerConfig; +import com.google.cloud.storage.transfermanager.UploadResult; +import java.io.IOException; +import java.nio.file.Path; +import java.util.List; + +class UploadMany { + + public static void uploadManyFiles(String bucketName, List files) throws IOException { + TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService(); + ParallelUploadConfig parallelUploadConfig = + ParallelUploadConfig.newBuilder().setBucketName(bucketName).build(); + List results = + transferManager.uploadFiles(files, parallelUploadConfig).getUploadResults(); + for (UploadResult result : results) { + System.out.println( + "Upload for " + + result.getInput().getName() + + " completed with status " + + result.getStatus()); + } + } +} +// [END storage_transfer_manager_upload_many] diff --git a/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java b/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java index 2f61fdbb7c..dc68167a68 100644 --- a/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java +++ b/samples/snippets/src/test/java/com/example/storage/ITBucketSnippets.java @@ -112,8 +112,8 @@ public class ITBucketSnippets { private static final String BUCKET = RemoteStorageHelper.generateBucketName(); private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); private static final String KMS_KEY_NAME = - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; private static final RetrySettings RETRY_SETTINGS = RetrySettings.newBuilder() .setInitialRetryDelay(Duration.ofSeconds(2)) @@ -465,8 +465,8 @@ public void deleteBucketDefaultKmsKey() throws Throwable { .get(BUCKET) .toBuilder() .setDefaultKmsKeyName( - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one") + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one") .build() .update(); TestUtils.retryAssert( diff --git a/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java b/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java index feca2ca807..0ebaa55c6d 100644 --- a/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java +++ b/samples/snippets/src/test/java/com/example/storage/ITObjectSnippets.java @@ -97,8 +97,8 @@ public class ITObjectSnippets { private static final byte[] CONTENT = STRING_CONTENT.getBytes(UTF_8); private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); private static final String KMS_KEY_NAME = - "projects/java-docs-samples-testing/locations/us/keyRings/" - + "jds_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; + "projects/cloud-java-ci-sample/locations/us/keyRings/" + + "gcs_test_kms_key_ring/cryptoKeys/gcs_kms_key_one"; private static Storage storage; diff --git a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java index 877ec89dae..847ec0d75a 100644 --- a/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java +++ b/samples/snippets/src/test/java/com/example/storage/QuickstartSampleIT.java @@ -18,9 +18,11 @@ import static com.google.common.truth.Truth.assertThat; +import com.google.cloud.storage.BucketInfo; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; import com.google.cloud.testing.junit4.StdOutCaptureRule; +import com.google.storage.control.v2.StorageLayoutName; import java.util.UUID; import org.junit.After; import org.junit.Before; @@ -73,4 +75,17 @@ public void testQuickstartGrpcDp() throws Exception { String got = stdOutCaptureRule.getCapturedOutputAsUtf8String(); assertThat(got).contains(String.format("Bucket %s created.", bucketName)); } + + @Test + public void testQuickstartStorageControl() throws Exception { + Storage storageClient = StorageOptions.getDefaultInstance().getService(); + storageClient.create(BucketInfo.of(bucketName)); + QuickstartStorageControlSample.main(bucketName); + String got = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(got) + .contains( + String.format( + "Performed getStorageLayout request for %s", + StorageLayoutName.format("_", bucketName))); + } } diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java index a3ff52a3c1..7bfd95242e 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/CreateBucketPubSubNotificationTest.java @@ -40,6 +40,8 @@ public class CreateBucketPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-create-%s", PROJECT, ID); @@ -57,8 +59,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java index d83960c44c..aab1073b38 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/DeleteBucketPubSubNotificationTest.java @@ -44,6 +44,8 @@ public class DeleteBucketPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-delete-%s", PROJECT, ID); @@ -62,8 +64,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java index 643c51bfd6..88a4613e7a 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/ListPubSubNotificationsTest.java @@ -44,6 +44,8 @@ public class ListPubSubNotificationsTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-list-%s", PROJECT, ID); @@ -57,8 +59,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java index ce3dd804bc..d342795a85 100644 --- a/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java +++ b/samples/snippets/src/test/java/com/example/storage/bucket/PrintPubSubNotificationTest.java @@ -40,6 +40,8 @@ public class PrintPubSubNotificationTest extends TestBase { Notification.PayloadFormat.JSON_API_V1.JSON_API_V1; private static final Map CUSTOM_ATTRIBUTES = ImmutableMap.of("label1", "value1"); private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT"); + private static final String PROJECT_NUMBER = System.getenv("GOOGLE_CLOUD_PROJECT_NUMBER"); + private static final String ID = UUID.randomUUID().toString().substring(0, 8); private static final String TOPIC = String.format("projects/%s/topics/new-topic-print-%s", PROJECT, ID); @@ -53,8 +55,15 @@ public static void configureTopicAdminClient() throws IOException { GetIamPolicyRequest getIamPolicyRequest = GetIamPolicyRequest.newBuilder().setResource(TOPIC).build(); com.google.iam.v1.Policy policy = topicAdminClient.getIamPolicy(getIamPolicyRequest); - Binding binding = - Binding.newBuilder().setRole("roles/owner").addMembers("allAuthenticatedUsers").build(); + // For available bindings identities, see + // https://cloud.google.com/iam/docs/overview#concepts_related_identity + String member = + PROJECT_NUMBER != null + ? "serviceAccount:service-" + + PROJECT_NUMBER + + "@gs-project-accounts.iam.gserviceaccount.com" + : "allAuthenticatedUsers"; + Binding binding = Binding.newBuilder().setRole("roles/owner").addMembers(member).build(); SetIamPolicyRequest setIamPolicyRequest = SetIamPolicyRequest.newBuilder() .setResource(TOPIC) diff --git a/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java new file mode 100644 index 0000000000..4a9a3d0440 --- /dev/null +++ b/samples/snippets/src/test/java/com/example/storage/transfermanager/ITTransferManagerSamples.java @@ -0,0 +1,115 @@ +/* + * Copyright 2024 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.transfermanager; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.cloud.storage.BlobInfo; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.testing.RemoteStorageHelper; +import com.google.cloud.testing.junit4.StdOutCaptureRule; +import com.google.common.collect.ImmutableList; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +public class ITTransferManagerSamples { + private static final String BUCKET = RemoteStorageHelper.generateBucketName(); + private static Storage storage; + private static List blobs; + private static final String PROJECT_ID = System.getenv("GOOGLE_CLOUD_PROJECT"); + @Rule public final StdOutCaptureRule stdOutCaptureRule = new StdOutCaptureRule(); + @Rule public final TemporaryFolder tmp = new TemporaryFolder(); + @Rule public final TemporaryFolder tmpDirectory = new TemporaryFolder(); + + @BeforeClass + public static void beforeClass() { + RemoteStorageHelper helper = RemoteStorageHelper.create(); + storage = helper.getOptions().getService(); + storage.create(BucketInfo.of(BUCKET)); + blobs = + Arrays.asList( + BlobInfo.newBuilder(BUCKET, "blob1").build(), + BlobInfo.newBuilder(BUCKET, "blob2").build(), + BlobInfo.newBuilder(BUCKET, "blob3").build()); + for (BlobInfo blob : blobs) { + storage.create(blob); + } + } + + @Test + public void uploadFiles() throws Exception { + File tmpFile = File.createTempFile("file", ".txt"); + File tmpFile2 = File.createTempFile("file2", ".txt"); + File tmpFile3 = File.createTempFile("file3", ".txt"); + List files = ImmutableList.of(tmpFile.toPath(), tmpFile2.toPath(), tmpFile3.toPath()); + UploadMany.uploadManyFiles(BUCKET, files); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("file")).isTrue(); + assertThat(snippetOutput.contains("file2")).isTrue(); + assertThat(snippetOutput.contains("file3")).isTrue(); + } + + @Test + public void uploadDirectory() throws IOException { + File tmpFile = tmpDirectory.newFile("fileDirUpload.txt"); + File tmpFile2 = tmpDirectory.newFile("fileDirUpload2.txt"); + File tmpFile3 = tmpDirectory.newFile("fileDirUpload3.txt"); + UploadDirectory.uploadDirectoryContents(BUCKET, tmpDirectory.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("fileDirUpload.txt")).isTrue(); + assertThat(snippetOutput.contains("fileDirUpload2.txt")).isTrue(); + assertThat(snippetOutput.contains("fileDirUpload3.txt")).isTrue(); + } + + @Test + public void downloadBucket() { + String downloadFullBucketName = RemoteStorageHelper.generateBucketName(); + storage.create(BucketInfo.of(downloadFullBucketName)); + List bucketBlobs = + Arrays.asList( + BlobInfo.newBuilder(downloadFullBucketName, "bucketb1").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb2").build(), + BlobInfo.newBuilder(downloadFullBucketName, "bucketb3").build()); + for (BlobInfo blob : bucketBlobs) { + storage.create(blob); + } + DownloadBucket.downloadBucketContents( + PROJECT_ID, downloadFullBucketName, tmp.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("bucketb1")).isTrue(); + assertThat(snippetOutput.contains("bucketb2")).isTrue(); + assertThat(snippetOutput.contains("bucketb3")).isTrue(); + } + + @Test + public void downloadFiles() { + DownloadMany.downloadManyBlobs(BUCKET, blobs, tmp.getRoot().toPath()); + String snippetOutput = stdOutCaptureRule.getCapturedOutputAsUtf8String(); + assertThat(snippetOutput.contains("blob1")).isTrue(); + assertThat(snippetOutput.contains("blob2")).isTrue(); + assertThat(snippetOutput.contains("blob3")).isTrue(); + } +} diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index 365e0b7536..306e28a61c 100644 --- a/storage-shared-benchmarking/pom.xml +++ b/storage-shared-benchmarking/pom.xml @@ -10,7 +10,7 @@ com.google.cloud google-cloud-storage-parent - 2.36.1 + 2.37.0 @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.36.1 + 2.37.0 tests diff --git a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java index 32d85b0792..b1626a2848 100644 --- a/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java +++ b/storage-shared-benchmarking/src/main/java/com/google/cloud/storage/benchmarking/StorageSharedBenchmarkingCli.java @@ -87,6 +87,9 @@ public final class StorageSharedBenchmarkingCli implements Runnable { defaultValue = "0") int warmup; + @Option(names = "-bidi_enabled", description = "If bidi should be enabled") + boolean bidiEnabled; + Path tempDir; PrintWriter printWriter; @@ -107,11 +110,8 @@ public void run() { case "w1r3": runWorkload1(); break; - case "bidi": - runWorkloadBidi(); - break; - case "default-nobidi": - runWorkloadNoBidi(); + case "write-only": + runWorkloadWriteOnly(); break; default: throw new IllegalStateException("Specify a workload to run"); @@ -158,36 +158,31 @@ private void runWorkload1DirectPath() { } } - private void runWorkloadBidi() { - StorageOptions options = - StorageOptions.grpc() - .setProjectId(project) - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) - .build(); - Storage storageClient = options.getService(); + private void runWorkloadWriteOnly() { try { - runBidi(storageClient); + if (bidiEnabled) { + StorageOptions options = + StorageOptions.grpc() + .setProjectId(project) + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.bidiWrite()) + .build(); + Storage storageClient = options.getService(); + runBidi(storageClient); + } else { + StorageOptions options = + StorageOptions.grpc() + .setProjectId(project) + .setBlobWriteSessionConfig(BlobWriteSessionConfigs.getDefault()) + .build(); + Storage storageClient = options.getService(); + runBidi(storageClient); + } } catch (Exception e) { System.err.println("Failed to run workload bidi" + e.getMessage()); System.exit(1); } } - private void runWorkloadNoBidi() { - StorageOptions options = - StorageOptions.grpc() - .setProjectId(project) - .setBlobWriteSessionConfig(BlobWriteSessionConfigs.getDefault()) - .build(); - Storage storageClient = options.getService(); - try { - runBidi(storageClient); - } catch (Exception e) { - System.err.println("Failed to run workload no bidi" + e.getMessage()); - System.exit(1); - } - } - private void runW1R3(Storage storageClient) throws ExecutionException, InterruptedException { ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(workers)); diff --git a/versions.txt b/versions.txt index af578c61ca..d17f59a970 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.36.1:2.36.1 -gapic-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -grpc-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -proto-google-cloud-storage-v2:2.36.1-alpha:2.36.1-alpha -google-cloud-storage-control:2.36.1-alpha:2.36.1-alpha -proto-google-cloud-storage-control-v2:2.36.1-alpha:2.36.1-alpha -grpc-google-cloud-storage-control-v2:2.36.1-alpha:2.36.1-alpha +google-cloud-storage:2.37.0:2.37.0 +gapic-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +grpc-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +proto-google-cloud-storage-v2:2.37.0-alpha:2.37.0-alpha +google-cloud-storage-control:2.37.0-alpha:2.37.0-alpha +proto-google-cloud-storage-control-v2:2.37.0-alpha:2.37.0-alpha +grpc-google-cloud-storage-control-v2:2.37.0-alpha:2.37.0-alpha