diff --git a/.github/release-please.yml b/.github/release-please.yml index bbe99166de..f8ded3a6dd 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -2,67 +2,28 @@ bumpMinorPreMajor: true handleGHRelease: true releaseType: java-yoshi extraFiles: - - README.md - - .readme-partials.yaml + - README.md + - .readme-partials.yaml branches: - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-lts - branch: 1.113.14-sp - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-yoshi - branch: 1.106.1-patch - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-yoshi - branch: 1.111.3-patch - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-yoshi - branch: java7 - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-yoshi - branch: 2.1.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - branch: 2.6.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - branch: 2.15.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - extraFiles: - - README.md - branch: 2.22.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - extraFiles: - - README.md - branch: 2.30.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - extraFiles: - - README.md - - .readme-partials.yaml - branch: 2.38.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - extraFiles: - - README.md - - .readme-partials.yaml - branch: 2.47.x - - bumpMinorPreMajor: true - handleGHRelease: true - releaseType: java-backport - extraFiles: - - README.md - - .readme-partials.yaml - branch: 2.49.x + - branch: 1.113.14-sp + releaseType: java-lts + - branch: 1.106.1-patch + - branch: 1.111.3-patch + - branch: java7 + - branch: 2.1.x + - branch: 2.6.x + releaseType: java-backport + - branch: 2.15.x + releaseType: java-backport + - branch: 2.22.x + releaseType: java-backport + - branch: 2.30.x + releaseType: java-backport + - branch: 2.38.x + releaseType: java-backport + - branch: 2.47.x + releaseType: java-backport + - branch: 2.49.x + releaseType: java-backport + - branch: protobuf-4.x-rc + manifest: true diff --git a/.github/workflows/hermetic_library_generation.yaml b/.github/workflows/hermetic_library_generation.yaml index 25abdf6a8a..dcebab8bbc 100644 --- a/.github/workflows/hermetic_library_generation.yaml +++ b/.github/workflows/hermetic_library_generation.yaml @@ -32,7 +32,7 @@ jobs: else echo "SHOULD_RUN=true" >> $GITHUB_ENV fi - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 if: env.SHOULD_RUN == 'true' with: fetch-depth: 0 @@ -77,7 +77,7 @@ jobs: echo "SHOULD_RUN=false" >> $GITHUB_ENV fi - - uses: googleapis/sdk-platform-java/.github/scripts@v2.64.1 + - uses: googleapis/sdk-platform-java/.github/scripts@v2.65.1 if: env.SHOULD_RUN == 'true' with: base_ref: ${{ github.base_ref }} diff --git a/.github/workflows/unmanaged_dependency_check.yaml b/.github/workflows/unmanaged_dependency_check.yaml index d8267b1548..73fcb70959 100644 --- a/.github/workflows/unmanaged_dependency_check.yaml +++ b/.github/workflows/unmanaged_dependency_check.yaml @@ -5,7 +5,7 @@ jobs: unmanaged_dependency_check: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-java@v3 with: distribution: temurin @@ -17,6 +17,6 @@ jobs: # repository .kokoro/build.sh - name: Unmanaged dependency check - uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.54.1 + uses: googleapis/sdk-platform-java/java-shared-dependencies/unmanaged-dependency-check@google-cloud-shared-dependencies/v3.55.1 with: bom-path: google-cloud-storage-bom/pom.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index 51558248ec..0f3dc4a9ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # Changelog +## [2.62.0](https://github.com/googleapis/java-storage/compare/v2.61.0...v2.62.0) (2026-01-15) + + +### Features + +* Add default e2e checksum validation in the final call of resumable uploads ([#3450](https://github.com/googleapis/java-storage/issues/3450)) ([37d2bba](https://github.com/googleapis/java-storage/commit/37d2bba93dfbdc9a81195aff9325a66883b6795f)) + + +### Bug Fixes + +* Update appendable upload retry logic to be able to more gracefully handle slow uploads ([#3438](https://github.com/googleapis/java-storage/issues/3438)) ([e660e5a](https://github.com/googleapis/java-storage/commit/e660e5a24f35798c6fcd6c9b30cf0a8324e5f5f8)) + + +### Dependencies + +* Update dependency com.google.cloud:sdk-platform-java-config to v3.55.1 ([#3461](https://github.com/googleapis/java-storage/issues/3461)) ([7e45b9e](https://github.com/googleapis/java-storage/commit/7e45b9e6f03ddea3e0fce31b95f5b54c37799be4)) +* Update googleapis/sdk-platform-java action to v2.65.1 ([#3460](https://github.com/googleapis/java-storage/issues/3460)) ([2a42131](https://github.com/googleapis/java-storage/commit/2a42131d3850e661a53a93dd36b87fd58acd2a4f)) + +## [2.61.0](https://github.com/googleapis/java-storage/compare/v2.60.0...v2.61.0) (2025-12-15) + + +### Features + +* Add support for partial success in ListBuckets for json ([#3415](https://github.com/googleapis/java-storage/issues/3415)) ([37ef7f3](https://github.com/googleapis/java-storage/commit/37ef7f3894a867257d5366ab36129043b9a884f8)) +* Modifying getters and setters to be more inline with s3 interface. ([0a8bbea](https://github.com/googleapis/java-storage/commit/0a8bbeaf8babd296fce0690421d2e480b361ca7e)) +* **mpu:** Breaking change modifying getters and setters in MPU to be more inline with s3 interface. ([66d54e2](https://github.com/googleapis/java-storage/commit/66d54e2dc36d90853bae4d529a620f45a7001487)) + + +### Bug Fixes + +* **deps:** Update the Java code generator (gapic-generator-java) to 2.64.1 ([511ff51](https://github.com/googleapis/java-storage/commit/511ff514410e55425e968ab900ac1b8825fe507a)) + + +### Dependencies + +* Update actions/checkout action to v6 ([d934ad9](https://github.com/googleapis/java-storage/commit/d934ad91aa1bf50e04870b1af747f1947fb2cbea)) +* Update actions/checkout action to v6 ([d99dd53](https://github.com/googleapis/java-storage/commit/d99dd53a0401f5460a63be7a6b927a27cdad0997)) +* Update dependency com.google.apis:google-api-services-storage to v1-rev20251118-2.0.0 ([f48fa3f](https://github.com/googleapis/java-storage/commit/f48fa3f1dc5feabd89be063b138804b83f722c0c)) +* Update dependency com.google.apis:google-api-services-storage to v1-rev20251118-2.0.0 ([#3427](https://github.com/googleapis/java-storage/issues/3427)) ([4612e72](https://github.com/googleapis/java-storage/commit/4612e72051d35b22135811a8723a65646a90d45e)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.54.2 ([90a71be](https://github.com/googleapis/java-storage/commit/90a71be0899d06995b515d875c65cdc5f852c7b0)) +* Update dependency com.google.cloud:sdk-platform-java-config to v3.54.2 ([#3424](https://github.com/googleapis/java-storage/issues/3424)) ([c989dc3](https://github.com/googleapis/java-storage/commit/c989dc3e65386e55bc25d2f6f63e499deda3fc69)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.59.0 ([f5d8337](https://github.com/googleapis/java-storage/commit/f5d8337ad556770a55cc260975e44e85e8e831b0)) +* Update gcr.io/cloud-devrel-public-resources/storage-testbench docker tag to v0.59.0 ([5480ce3](https://github.com/googleapis/java-storage/commit/5480ce347493ec425b675f462a42f45c22b06c28)) +* Update googleapis/sdk-platform-java action to v2.64.2 ([23494d7](https://github.com/googleapis/java-storage/commit/23494d79d3a2785c30c75f50fd3b0a03598c3599)) +* Update googleapis/sdk-platform-java action to v2.64.2 ([#3425](https://github.com/googleapis/java-storage/issues/3425)) ([fad2d7a](https://github.com/googleapis/java-storage/commit/fad2d7a780a084acd8ccdf2bb2f97a335c438594)) + ## [2.60.0](https://github.com/googleapis/java-storage/compare/v2.59.0...v2.60.0) (2025-11-07) diff --git a/README.md b/README.md index c724578705..40662dd1a7 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.71.0 + 26.73.0 pom import @@ -46,12 +46,12 @@ If you are using Maven without the BOM, add this to your dependencies: com.google.cloud google-cloud-storage - 2.60.0 + 2.61.0 com.google.cloud google-cloud-storage-control - 2.60.0 + 2.61.0 ``` @@ -59,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.71.0') +implementation platform('com.google.cloud:libraries-bom:26.72.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.60.0' +implementation 'com.google.cloud:google-cloud-storage:2.62.0' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.60.0" +libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.62.0" ``` ## Authentication @@ -484,7 +484,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.60.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.62.0 [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 4d78249222..37f83ffaa6 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.60.1-SNAPSHOT + 2.62.0 gapic-google-cloud-storage-v2 GRPC library for gapic-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.0 diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java index 1c0887d4ed..1b02caf1d4 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageSettings.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageSettings.java index 30131d23e4..f1a63b98cf 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageSettings.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/package-info.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/package-info.java index cd43b211c7..8bd261cb4a 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/package-info.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageCallableFactory.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageCallableFactory.java index 01a0573308..272e2c8c22 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageCallableFactory.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageCallableFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageStub.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageStub.java index 060ffb20d3..096ef7ae23 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageStub.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/GrpcStorageStub.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStub.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStub.java index 4b0aa6d73f..2def7e8670 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStub.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStub.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStubSettings.java b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStubSettings.java index 5401277c77..e2a5ce1212 100644 --- a/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStubSettings.java +++ b/gapic-google-cloud-storage-v2/src/main/java/com/google/storage/v2/stub/StorageStubSettings.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorage.java b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorage.java index da6553da1d..37179e5870 100644 --- a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorage.java +++ b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorage.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorageImpl.java b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorageImpl.java index a5cd72033b..fd6c74ad0f 100644 --- a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorageImpl.java +++ b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/MockStorageImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java index a19cf68482..99fdcaf159 100644 --- a/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java +++ b/gapic-google-cloud-storage-v2/src/test/java/com/google/storage/v2/StorageClientTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/generation_config.yaml b/generation_config.yaml index 9b1b477a6f..5bc0f314af 100644 --- a/generation_config.yaml +++ b/generation_config.yaml @@ -1,6 +1,6 @@ gapic_generator_version: 2.64.1 -googleapis_commitish: cf0434f4bd20618db60ddd16a1e7db2c0dfb9158 -libraries_bom_version: 26.71.0 +googleapis_commitish: 8c06c1e04ae562f49f411357577c700e9142f33c +libraries_bom_version: 26.72.0 libraries: - api_shortname: storage name_pretty: Cloud Storage diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml index 1eaee5f54e..3c0abc9290 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.60.1-SNAPSHOT + 2.62.0 pom com.google.cloud sdk-platform-java-config - 3.54.1 + 3.55.1 @@ -69,37 +69,37 @@ com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc proto-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.cloud google-cloud-storage-control - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.60.1-SNAPSHOT + 2.62.0 diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml index 5d243dc419..578dd02735 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.60.1-SNAPSHOT + 2.62.0 google-cloud-storage-control GRPC library for google-cloud-storage-control com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.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 485abea93f..9093498e02 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 191f0f6526..c08d699ad4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/package-info.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/package-info.java index 47fa364a79..f7108400d1 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/package-info.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlCallableFactory.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlCallableFactory.java index 347513ccc2..61f4fd17b8 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlCallableFactory.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/GrpcStorageControlCallableFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 5778eaffc5..c8c7e7d431 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java index dac9e0655e..2da1ee4034 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlCallableFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java index a878e2155b..ff19274ff1 100644 --- a/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java +++ b/google-cloud-storage-control/src/main/java/com/google/storage/control/v2/stub/HttpJsonStorageControlStub.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 8a44f5c389..c5442996e4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b72c48f76f..b30b14dc46 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControl.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControl.java index 365f7e1879..cbba4d71cd 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControl.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/MockStorageControl.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 069a922359..0ed42b335b 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java index 10eda32485..f8570a4be3 100644 --- a/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java +++ b/google-cloud-storage-control/src/test/java/com/google/storage/control/v2/StorageControlClientHttpJsonTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 ea1e9bc7dc..adf6978f8c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/google-cloud-storage/clirr-ignored-differences.xml b/google-cloud-storage/clirr-ignored-differences.xml index 7a61b49855..99ba9b1799 100644 --- a/google-cloud-storage/clirr-ignored-differences.xml +++ b/google-cloud-storage/clirr-ignored-differences.xml @@ -138,12 +138,6 @@ com/google/cloud/storage/Storage com.google.cloud.storage.BlobAppendableUpload blobAppendableUpload(com.google.cloud.storage.BlobInfo, com.google.cloud.storage.BlobAppendableUploadConfig, com.google.cloud.storage.Storage$BlobWriteOption[]) - - 7005 - com/google/cloud/storage/Hasher$* - * validate(*) - * validate(*) - 7013 @@ -167,6 +161,12 @@ com.google.cloud.storage.BucketInfo$Builder setGoogleManagedEncryptionEnforcementConfig(com.google.cloud.storage.BucketInfo$GoogleManagedEncryptionEnforcementConfig) + + 7013 + com/google/cloud/storage/BucketInfo$Builder + com.google.cloud.storage.BucketInfo$Builder setIsUnreachable(java.lang.Boolean) + + 7004 @@ -197,5 +197,173 @@ void flush() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + com.google.cloud.storage.Storage$PredefinedAcl getCannedAcl() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + java.lang.String getContentType() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + java.time.OffsetDateTime getCustomTime() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + java.lang.String getKmsKeyName() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + java.util.Map getMetadata() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + com.google.cloud.storage.multipartupload.model.ObjectLockMode getObjectLockMode() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + java.time.OffsetDateTime getObjectLockRetainUntilDate() + + + 7002 + com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest + com.google.cloud.storage.StorageClass getStorageClass() + + + + + 7013 + com/google/cloud/storage/MultipartUploadClient + * *(*) + + + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsRequest + java.lang.Integer getMaxParts() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsRequest + java.lang.Integer getPartNumberMarker() + + + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + java.lang.String getBucket() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + java.lang.String getKey() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + int getMaxParts() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + int getNextPartNumberMarker() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + int getPartNumberMarker() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + java.util.List getParts() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + com.google.cloud.storage.StorageClass getStorageClass() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + java.lang.String getUploadId() + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse + boolean isTruncated() + + + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setBucket(java.lang.String) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setIsTruncated(boolean) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setKey(java.lang.String) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setMaxParts(int) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setNextPartNumberMarker(int) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setPartNumberMarker(int) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setParts(java.util.List) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setStorageClass(com.google.cloud.storage.StorageClass) + + + 7002 + com/google/cloud/storage/multipartupload/model/ListPartsResponse$Builder + com.google.cloud.storage.multipartupload.model.ListPartsResponse$Builder setUploadId(java.lang.String) + + + + + 7006 + com/google/cloud/storage/Hasher* + * nullSafeConcat(*) + ** + + + 7005 + com/google/cloud/storage/Hasher* + ** + ** + diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml index 56552e51e7..a89f5445d3 100644 --- a/google-cloud-storage/pom.xml +++ b/google-cloud-storage/pom.xml @@ -2,7 +2,7 @@ 4.0.0 google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 jar Google Cloud Storage https://github.com/googleapis/java-storage @@ -12,11 +12,11 @@ com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.0 google-cloud-storage - 1.125.0 + 1.125.1 @@ -255,14 +255,14 @@ com.google.api.grpc proto-google-cloud-kms-v1 - 0.172.0 + 0.174.0 test com.google.cloud google-cloud-kms - 2.81.0 + 2.83.0 test @@ -503,7 +503,7 @@ org.codehaus.mojo exec-maven-plugin - 3.6.2 + 3.6.3 diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiUploadStreamingStream.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiUploadStreamingStream.java index 6da243e541..f6b9ae399e 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiUploadStreamingStream.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BidiUploadStreamingStream.java @@ -408,6 +408,8 @@ public void onResponse(BidiWriteObjectResponse response) { @Nullable StorageException se = state.onResponse(response); if (se != null) { retryContext.recordError(se, onSuccess, onFailure); + } else { + retryContext.reset(); } } catch (Throwable t) { // catch an error that might happen while processing and forward it to our retry context diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannelV2.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannelV2.java index 703c9f980c..edda3ce245 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannelV2.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BlobWriteChannelV2.java @@ -79,6 +79,7 @@ protected LazyWriteChannel newLazyWriteChannel() { blobChannelContext .getRetrier() .withAlg(blobChannelContext.getRetryAlgorithmManager().idempotent())) + .setHasher(start.getHasher()) .buffered(getBufferHandle()) .setStartAsync(ApiFutures.immediateFuture(start)) .build()); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java index e7ab9cff6f..7581a38e00 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Bucket.java @@ -789,6 +789,12 @@ public Builder setCustomerSuppliedEncryptionEnforcementConfig( return this; } + @Override + public Builder setIsUnreachable(Boolean isUnreachable) { + infoBuilder.setIsUnreachable(isUnreachable); + return this; + } + @Override public Bucket build() { return new Bucket(storage, infoBuilder); @@ -997,6 +1003,12 @@ public Builder clearCustomerSuppliedEncryptionEnforcementConfig() { infoBuilder.clearCustomerSuppliedEncryptionEnforcementConfig(); return this; } + + @Override + Builder clearIsUnreachable() { + infoBuilder.clearIsUnreachable(); + return this; + } } Bucket(Storage storage, BucketInfo.BuilderImpl infoBuilder) { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java index 837899ca95..e6ec27cca4 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java @@ -131,6 +131,7 @@ public class BucketInfo implements Serializable { customerManagedEncryptionEnforcementConfig; private final @Nullable CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig; + private final Boolean isUnreachable; private final transient ImmutableSet modifiedFields; @@ -2638,6 +2639,8 @@ public Builder setRetentionPeriodDuration(Duration retentionPeriod) { */ public abstract Builder setIpFilter(IpFilter ipFilter); + public abstract Builder setIsUnreachable(Boolean isUnreachable); + /** Creates a {@code BucketInfo} object. */ public abstract BucketInfo build(); @@ -2708,6 +2711,8 @@ public Builder setRetentionPeriodDuration(Duration retentionPeriod) { abstract Builder clearCustomerManagedEncryptionEnforcementConfig(); abstract Builder clearCustomerSuppliedEncryptionEnforcementConfig(); + + abstract Builder clearIsUnreachable(); } static final class BuilderImpl extends Builder { @@ -2751,6 +2756,7 @@ static final class BuilderImpl extends Builder { private GoogleManagedEncryptionEnforcementConfig googleManagedEncryptionEnforcementConfig; private CustomerManagedEncryptionEnforcementConfig customerManagedEncryptionEnforcementConfig; private CustomerSuppliedEncryptionEnforcementConfig customerSuppliedEncryptionEnforcementConfig; + private Boolean isUnreachable; private final ImmutableSet.Builder modifiedFields = ImmutableSet.builder(); BuilderImpl(String name) { @@ -2799,6 +2805,7 @@ static final class BuilderImpl extends Builder { bucketInfo.customerManagedEncryptionEnforcementConfig; customerSuppliedEncryptionEnforcementConfig = bucketInfo.customerSuppliedEncryptionEnforcementConfig; + isUnreachable = bucketInfo.isUnreachable; } @Override @@ -3250,6 +3257,13 @@ public Builder setIpFilter(IpFilter ipFilter) { return this; } + @Override + public Builder setIsUnreachable(Boolean isUnreachable) { + Boolean tmp = firstNonNull(isUnreachable, Data.nullOf(Boolean.class)); + this.isUnreachable = tmp; + return this; + } + @Override public BucketInfo build() { checkNotNull(name); @@ -3460,6 +3474,12 @@ BuilderImpl clearCustomerSuppliedEncryptionEnforcementConfig() { return this; } + @Override + BuilderImpl clearIsUnreachable() { + this.isUnreachable = null; + return this; + } + private Builder clearDeleteLifecycleRules() { if (lifecycleRules != null && !lifecycleRules.isEmpty()) { ImmutableList nonDeleteRules = @@ -3513,6 +3533,7 @@ private Builder clearDeleteLifecycleRules() { customerManagedEncryptionEnforcementConfig = builder.customerManagedEncryptionEnforcementConfig; customerSuppliedEncryptionEnforcementConfig = builder.customerSuppliedEncryptionEnforcementConfig; + isUnreachable = builder.isUnreachable; modifiedFields = builder.modifiedFields.build(); } @@ -3886,6 +3907,16 @@ public HierarchicalNamespace getHierarchicalNamespace() { return customerSuppliedEncryptionEnforcementConfig; } + /** + * Returns a {@code Boolean} with {@code true} if the bucket is unreachable, else {@code null} + * + *

A bucket may be unreachable if the region in which it resides is experiencing an outage or + * if there are other temporary access issues. + */ + public Boolean isUnreachable() { + return Data.isNull(isUnreachable) ? null : isUnreachable; + } + /** Returns a builder for the current bucket. */ public Builder toBuilder() { return new BuilderImpl(this); @@ -3931,7 +3962,8 @@ public int hashCode() { ipFilter, googleManagedEncryptionEnforcementConfig, customerManagedEncryptionEnforcementConfig, - customerSuppliedEncryptionEnforcementConfig); + customerSuppliedEncryptionEnforcementConfig, + isUnreachable); } @Override @@ -3985,7 +4017,8 @@ public boolean equals(Object o) { that.customerManagedEncryptionEnforcementConfig) && Objects.equals( customerSuppliedEncryptionEnforcementConfig, - that.customerSuppliedEncryptionEnforcementConfig); + that.customerSuppliedEncryptionEnforcementConfig) + && Objects.equals(isUnreachable, that.isUnreachable); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteSizeConstants.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteSizeConstants.java index 463df327f5..c7110c1b12 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteSizeConstants.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/ByteSizeConstants.java @@ -37,6 +37,7 @@ final class ByteSizeConstants { static final long _256KiBL = 262144L; static final long _512KiBL = 524288L; static final long _768KiBL = 786432L; + static final long _1MiBL = 1048576L; private ByteSizeConstants() {} } 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 53a14ca264..6d163f1d81 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 @@ -193,7 +193,12 @@ public WritableByteChannelSession writeSession( ApiFuture startAsync = ApiFutures.immediateFuture( JsonResumableWrite.of( - encode, optionsMap, uploadIdSupplier.get(), 0L)); + encode, + optionsMap, + uploadIdSupplier.get(), + 0L, + opts.getHasher(), + opts.getHasher().initialValue())); return ResumableMedia.http() .write() 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 d79b30e1fc..b536340e9c 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 @@ -454,6 +454,7 @@ public Page list(BucketListOption... options) { Opts opts = Opts.unwrap(options).prepend(defaultOpts).prepend(ALL_BUCKET_FIELDS); GrpcCallContext grpcCallContext = opts.grpcMetadataMapper().apply(GrpcCallContext.createDefault()); + ListBucketsRequest request = defaultProjectId .get() @@ -461,19 +462,29 @@ public Page list(BucketListOption... options) { .andThen(opts.listBucketsRequest()) .apply(ListBucketsRequest.newBuilder()) .build(); - try { - GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); - return retrier.run( - retryAlgorithmManager.getFor(request), - () -> storageClient.listBucketsPagedCallable().call(request, merge), - resp -> - new TransformingPageDecorator<>( - resp.getPage(), - syntaxDecoders.bucket.andThen(opts.clearBucketFields()), - retrier, - retryAlgorithmManager.getFor(request))); - } catch (Exception e) { - throw StorageException.coalesce(e); + + if (!request.getReturnPartialSuccess()) { + try { + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + return retrier.run( + retryAlgorithmManager.getFor(request), + () -> storageClient.listBucketsPagedCallable().call(request, merge), + resp -> + new TransformingPageDecorator<>( + resp.getPage(), + syntaxDecoders.bucket.andThen(opts.clearBucketFields()), + retrier, + retryAlgorithmManager.getFor(request))); + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } else { + try { + com.google.storage.v2.ListBucketsResponse response = listBuckets(grpcCallContext, request); + return new ListBucketsWithPartialSuccessPage(grpcCallContext, request, response, opts); + } catch (Exception e) { + throw StorageException.coalesce(e); + } } } @@ -1619,6 +1630,78 @@ public Iterable getValues() { } } + private final class ListBucketsWithPartialSuccessPage implements Page { + + private final GrpcCallContext ctx; + private final ListBucketsRequest req; + private final com.google.storage.v2.ListBucketsResponse resp; + private final Opts opts; + + private ListBucketsWithPartialSuccessPage( + GrpcCallContext ctx, + ListBucketsRequest req, + com.google.storage.v2.ListBucketsResponse resp, + Opts opts) { + this.ctx = ctx; + this.req = req; + this.resp = resp; + this.opts = opts; + } + + @Override + public boolean hasNextPage() { + return !resp.getNextPageToken().isEmpty(); + } + + @Override + public String getNextPageToken() { + return resp.getNextPageToken(); + } + + @Override + public Page getNextPage() { + if (!hasNextPage()) { + return null; + } + ListBucketsRequest nextPageReq = + req.toBuilder().setPageToken(resp.getNextPageToken()).build(); + try { + com.google.storage.v2.ListBucketsResponse nextPageResp = listBuckets(ctx, nextPageReq); + return new ListBucketsWithPartialSuccessPage(ctx, nextPageReq, nextPageResp, opts); + } catch (Exception e) { + throw StorageException.coalesce(e); + } + } + + @Override + public Iterable getValues() { + Decoder bucketDecoder = + syntaxDecoders.bucket.andThen(opts.clearBucketFields()); + Stream reachable = resp.getBucketsList().stream().map(bucketDecoder::decode); + Stream unreachable = + resp.getUnreachableList().stream() + .map( + name -> { + String decoded = bucketNameCodec.decode(name); + return BucketInfo.newBuilder(decoded) + .setIsUnreachable(true) + .build() + .asBucket(GrpcStorageImpl.this); + }); + return Streams.concat(reachable, unreachable).collect(ImmutableList.toImmutableList()); + } + + @Override + public Iterable iterateAll() { + Page curr = this; + return () -> + streamIterate(curr, p -> p != null && p.hasNextPage(), Page::getNextPage) + .filter(Objects::nonNull) + .flatMap(p -> StreamSupport.stream(p.getValues().spliterator(), false)) + .iterator(); + } + } + static final class TransformingPageDecorator< RequestT, ResponseT, @@ -1858,6 +1941,15 @@ private SourceObject sourceObjectEncode(SourceBlob from) { return to.build(); } + private com.google.storage.v2.ListBucketsResponse listBuckets( + GrpcCallContext grpcCallContext, ListBucketsRequest request) { + GrpcCallContext merge = Utils.merge(grpcCallContext, Retrying.newCallContext()); + return retrier.run( + retryAlgorithmManager.getFor(request), + () -> storageClient.listBucketsCallable().call(request, merge), + Decoder.identity()); + } + private com.google.storage.v2.Bucket getBucketWithDefaultAcls(String bucketName) { Fields fields = UnifiedOpts.fields( 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 47a7b029e0..c1b506de2f 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 @@ -73,8 +73,8 @@ default Crc32cLengthKnown hash(Supplier b) { void validateUnchecked(Crc32cValue expected, ByteString byteString) throws UncheckedChecksumMismatchException; - @Nullable Crc32cLengthKnown nullSafeConcat( - @Nullable Crc32cLengthKnown r1, @NonNull Crc32cLengthKnown r2); + @Nullable > C nullSafeConcat( + @Nullable C r1, @Nullable Crc32cLengthKnown r2); /** * The initial value to use for this hasher. @@ -123,8 +123,8 @@ public void validate(Crc32cValue expected, ByteString b) {} public void validateUnchecked(Crc32cValue expected, ByteString byteString) {} @Override - public @Nullable Crc32cLengthKnown nullSafeConcat( - @Nullable Crc32cLengthKnown r1, @NonNull Crc32cLengthKnown r2) { + public > @Nullable C nullSafeConcat( + @Nullable C r1, @Nullable Crc32cLengthKnown r2) { return null; } @@ -189,14 +189,16 @@ public void validateUnchecked(Crc32cValue expected, ByteString byteString) } } + @SuppressWarnings("unchecked") @Override - @Nullable - public Crc32cLengthKnown nullSafeConcat( - @Nullable Crc32cLengthKnown r1, @NonNull Crc32cLengthKnown r2) { + public > @Nullable C nullSafeConcat( + @Nullable C r1, @Nullable Crc32cLengthKnown r2) { if (r1 == null) { return null; + } else if (r2 == null) { + return r1; } else { - return r1.concat(r2); + return (C) r1.concat(r2); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java index a069c24950..43c68c02b9 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpContentRange.java @@ -210,7 +210,7 @@ public String getHeaderValue() { @Override public boolean endOffsetEquals(long e) { - return false; + return e == Math.max(0, size - 1); } @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpWritableByteChannelSessionBuilder.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpWritableByteChannelSessionBuilder.java index a5474b5aee..ddb999e9b7 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpWritableByteChannelSessionBuilder.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/HttpWritableByteChannelSessionBuilder.java @@ -57,11 +57,13 @@ static final class ResumableUploadBuilder { @NonNull private final HttpClientContext httpClientContext; private RetrierWithAlg retrier; private LongConsumer committedBytesCallback; + private Hasher hasher; ResumableUploadBuilder(@NonNull HttpClientContext httpClientContext) { this.httpClientContext = httpClientContext; this.retrier = RetrierWithAlg.attemptOnce(); this.committedBytesCallback = l -> {}; + this.hasher = Hasher.defaultHasher(); } ResumableUploadBuilder setCommittedBytesCallback(@NonNull LongConsumer committedBytesCallback) { @@ -75,6 +77,11 @@ ResumableUploadBuilder withRetryConfig(@NonNull RetrierWithAlg retrier) { return this; } + ResumableUploadBuilder setHasher(@NonNull Hasher hasher) { + this.hasher = requireNonNull(hasher, "hasher must be non null"); + return this; + } + /** * Do not apply any intermediate buffering. Any call to {@link * java.nio.channels.WritableByteChannel#write(ByteBuffer)} will be segmented as is and sent to diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java index 08a908b12f..48a8558977 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonConversions.java @@ -18,6 +18,7 @@ import static com.google.cloud.storage.Storage.BucketField.IP_FILTER; import static com.google.cloud.storage.Storage.BucketField.SOFT_DELETE_POLICY; +import static com.google.cloud.storage.Utils.bucketNameCodec; import static com.google.cloud.storage.Utils.dateTimeCodec; import static com.google.cloud.storage.Utils.durationSecondsCodec; import static com.google.cloud.storage.Utils.ifNonNull; @@ -609,7 +610,7 @@ private Bucket bucketInfoEncode(BucketInfo from) { @SuppressWarnings("deprecation") private BucketInfo bucketInfoDecode(com.google.api.services.storage.model.Bucket from) { - BucketInfo.Builder to = new BucketInfo.BuilderImpl(from.getName()); + BucketInfo.Builder to = new BucketInfo.BuilderImpl(bucketNameCodec.decode(from.getName())); ifNonNull(from.getProjectNumber(), to::setProject); ifNonNull(from.getAcl(), toListOf(bucketAcl()::decode), to::setAcl); ifNonNull(from.getCors(), toListOf(cors()::decode), to::setCors); @@ -674,6 +675,9 @@ private BucketInfo bucketInfoDecode(com.google.api.services.storage.model.Bucket ifNonNull(from.getObjectRetention(), this::objectRetentionDecode, to::setObjectRetention); ifNonNull(from.getSoftDeletePolicy(), this::softDeletePolicyDecode, to::setSoftDeletePolicy); ifNonNull(from.getIpFilter(), ipFilterCodec::decode, to::setIpFilter); + if (from.containsKey("isUnreachable")) { + to.setIsUnreachable(Boolean.TRUE); + } return to.build(); } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java index d4347787e0..7003bd5d6c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableSession.java @@ -18,10 +18,14 @@ import com.google.api.services.storage.model.StorageObject; import com.google.cloud.storage.Conversions.Decoder; +import com.google.cloud.storage.Crc32cValue.Crc32cLengthKnown; +import com.google.cloud.storage.HttpContentRange.HasRange; import com.google.cloud.storage.Retrying.RetrierWithAlg; import com.google.cloud.storage.spi.v1.HttpRpcContext; import com.google.cloud.storage.spi.v1.HttpStorageRpc; import io.opencensus.trace.EndSpanOptions; +import java.nio.ByteBuffer; +import java.nio.channels.GatheringByteChannel; import java.util.Locale; import java.util.concurrent.atomic.AtomicBoolean; import org.checkerframework.checker.nullness.qual.Nullable; @@ -54,28 +58,119 @@ final class JsonResumableSession { ResumableOperationResult<@Nullable StorageObject> put( RewindableContent content, HttpContentRange contentRange) { + Crc32cValue crc32cSoFar = resumableWrite.getCumulativeCrc32c(); + @Nullable Crc32cValue nextCumulativeCrc32c = + resumableWrite.getHasher().nullSafeConcat(crc32cSoFar, content.getCrc32c()); + @Nullable Crc32cValue finalChecksum = + contentRange.isFinalizing() ? nextCumulativeCrc32c : null; JsonResumableSessionPutTask task = - new JsonResumableSessionPutTask(context, resumableWrite, content, contentRange); + new JsonResumableSessionPutTask( + context, resumableWrite, content, contentRange, finalChecksum); HttpRpcContext httpRpcContext = HttpRpcContext.getInstance(); try { httpRpcContext.newInvocationId(); AtomicBoolean dirty = new AtomicBoolean(false); - return retrier.run( - () -> { - if (dirty.getAndSet(true)) { - ResumableOperationResult<@Nullable StorageObject> query = query(); - long persistedSize = query.getPersistedSize(); - if (contentRange.endOffsetEquals(persistedSize) || query.getObject() != null) { - return query; - } else { - task.rewindTo(persistedSize); - } - } - return task.call(); - }, - Decoder.identity()); + ResumableOperationResult<@Nullable StorageObject> result = + retrier.run( + () -> { + if (dirty.getAndSet(true)) { + ResumableOperationResult<@Nullable StorageObject> query = query(); + long persistedSize = query.getPersistedSize(); + if (contentRange.endOffsetEquals(persistedSize) || query.getObject() != null) { + return query; + } else { + task.rewindTo(persistedSize); + } + } + return task.call(); + }, + Decoder.identity()); + + if (nextCumulativeCrc32c != null) { + long persistedSize = result.getPersistedSize(); + if (contentRange.endOffsetEquals(persistedSize) || result.getObject() != null) { + resumableWrite.setCumulativeCrc32c(nextCumulativeCrc32c); + } else if (contentRange instanceof HasRange) { + ByteRangeSpec range = ((HasRange) contentRange).range(); + content.rewindTo(0); + long serverConsumedBytes = persistedSize - range.beginOffset(); + try (HashingGatheringByteChannel hashingChannel = + new HashingGatheringByteChannel(serverConsumedBytes)) { + StorageException.wrapIOException(() -> content.writeTo(hashingChannel)); + resumableWrite.setCumulativeCrc32c( + resumableWrite.getHasher().nullSafeConcat(crc32cSoFar, hashingChannel.cumulative)); + } + } else { + throw new StorageException( + 0, + String.format( + Locale.US, + "Result persistedSize (%d) did not match expected end of contentRange (%s) and" + + " contentRange does not have range to allow automatic recovery", + persistedSize, + contentRange)); + } + } + return result; } finally { httpRpcContext.clearInvocationId(); } } + + private static final class HashingGatheringByteChannel implements GatheringByteChannel { + private final long maxBytesToConsume; + + private Crc32cLengthKnown cumulative; + + private HashingGatheringByteChannel(long maxBytesToConsume) { + this.maxBytesToConsume = maxBytesToConsume; + this.cumulative = Crc32cValue.zero(); + } + + @Override + public int write(ByteBuffer src) { + return Math.toIntExact(write(new ByteBuffer[] {src}, 0, 1)); + } + + @Override + public long write(ByteBuffer[] srcs) { + return write(srcs, 0, srcs.length); + } + + @Override + public long write(ByteBuffer[] srcs, int offset, int length) { + Crc32cLengthKnown cum = Crc32cValue.zero(); + for (int i = offset; i < length; i++) { + long toConsume = maxBytesToConsume - cum.getLength(); + if (toConsume <= 0) { + if (cum.getLength() == 0) { + return -1; + } else { + break; + } + } + + ByteBuffer buf = srcs[i]; + if (buf.remaining() <= toConsume) { + cum = cum.concat(Hasher.enabled().hash(buf)); + } else { + ByteBuffer slice = buf.slice(); + int limit = Math.toIntExact(toConsume); + slice.limit(limit); + cum = cum.concat(Hasher.enabled().hash(slice)); + buf.position(buf.position() + limit); + } + } + cumulative = cumulative.concat(cum); + return cum.getLength(); + } + + @Override + public boolean isOpen() { + return true; + } + + @Override + public void close() {} + } } 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 92de549bd8..81018d5f40 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 @@ -43,6 +43,7 @@ final class JsonResumableSessionPutTask private final JsonResumableWrite jsonResumableWrite; private final RewindableContent content; private final HttpContentRange originalContentRange; + private final @Nullable Crc32cValue cumulativeCrc32c; private HttpContentRange contentRange; @@ -52,11 +53,22 @@ final class JsonResumableSessionPutTask JsonResumableWrite jsonResumableWrite, RewindableContent content, HttpContentRange originalContentRange) { + this(httpClientContext, jsonResumableWrite, content, originalContentRange, null); + } + + @VisibleForTesting + JsonResumableSessionPutTask( + HttpClientContext httpClientContext, + JsonResumableWrite jsonResumableWrite, + RewindableContent content, + HttpContentRange originalContentRange, + @Nullable Crc32cValue cumulativeCrc32c) { this.context = httpClientContext; this.jsonResumableWrite = jsonResumableWrite; this.content = content; this.originalContentRange = originalContentRange; this.contentRange = originalContentRange; + this.cumulativeCrc32c = cumulativeCrc32c; } public void rewindTo(long offset) { @@ -101,6 +113,9 @@ public void rewindTo(long offset) { for (Entry e : jsonResumableWrite.getExtraHeaders().entrySet()) { headers.set(e.getKey(), e.getValue()); } + if (cumulativeCrc32c != null) { + headers.set("x-goog-hash", "crc32c=" + Utils.crc32cCodec.encode(cumulativeCrc32c.getValue())); + } HttpResponse response = null; try { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableWrite.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableWrite.java index 41bbec72ec..b2347c47f3 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableWrite.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/JsonResumableWrite.java @@ -31,6 +31,7 @@ import java.io.StringReader; import java.util.Map; import java.util.Objects; +import org.checkerframework.checker.lock.qual.GuardedBy; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.NonNull; @@ -39,6 +40,8 @@ final class JsonResumableWrite implements Serializable { private static final Gson gson = new Gson(); @MonotonicNonNull private transient StorageObject object; + @MonotonicNonNull private transient Hasher hasher; + @MonotonicNonNull private transient Crc32cValue cumulativeCrc32c; @MonotonicNonNull private final Map options; @MonotonicNonNull private final String signedUrl; @@ -48,13 +51,20 @@ final class JsonResumableWrite implements Serializable { private volatile String objectJson; + @GuardedBy("objectJson") + private String base64CumulativeCrc32c; + private JsonResumableWrite( StorageObject object, + @MonotonicNonNull Hasher hasher, + @MonotonicNonNull Crc32cValue cumulativeCrc32c, Map options, String signedUrl, @NonNull String uploadId, long beginOffset) { this.object = object; + this.hasher = hasher; + this.cumulativeCrc32c = cumulativeCrc32c; this.options = options; this.signedUrl = signedUrl; this.uploadId = uploadId; @@ -85,7 +95,20 @@ public JsonResumableWrite withBeginOffset(long newBeginOffset) { "New beginOffset must be >= existing beginOffset (%s >= %s)", newBeginOffset, beginOffset); - return new JsonResumableWrite(object, options, signedUrl, uploadId, newBeginOffset); + return new JsonResumableWrite( + object, hasher, cumulativeCrc32c, options, signedUrl, uploadId, newBeginOffset); + } + + public @MonotonicNonNull Hasher getHasher() { + return hasher; + } + + public @MonotonicNonNull Crc32cValue getCumulativeCrc32c() { + return cumulativeCrc32c; + } + + public void setCumulativeCrc32c(Crc32cValue cumulativeCrc32c) { + this.cumulativeCrc32c = cumulativeCrc32c; } @Override @@ -99,6 +122,8 @@ public boolean equals(Object o) { JsonResumableWrite that = (JsonResumableWrite) o; return beginOffset == that.beginOffset && Objects.equals(object, that.object) + && Objects.equals(hasher, that.hasher) + && cumulativeCrc32c.eqValue(that.cumulativeCrc32c) && Objects.equals(options, that.options) && Objects.equals(signedUrl, that.signedUrl) && Objects.equals(uploadId, that.uploadId); @@ -106,13 +131,16 @@ public boolean equals(Object o) { @Override public int hashCode() { - return Objects.hash(object, options, signedUrl, uploadId, beginOffset); + return Objects.hash( + object, hasher, cumulativeCrc32c.getValue(), options, signedUrl, uploadId, beginOffset); } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("object", object) + .add("hasher", hasher) + .add("cumulativeCrc32c", cumulativeCrc32c) .add("options", options) .add("signedUrl", signedUrl) .add("uploadId", uploadId) @@ -125,6 +153,7 @@ private String getObjectJson() { synchronized (this) { if (objectJson == null) { objectJson = gson.toJson(object); + base64CumulativeCrc32c = Utils.crc32cCodec.encode(cumulativeCrc32c.getValue()); } } } @@ -140,14 +169,38 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE in.defaultReadObject(); JsonReader jsonReader = gson.newJsonReader(new StringReader(this.objectJson)); this.object = gson.fromJson(jsonReader, StorageObject.class); + if (base64CumulativeCrc32c != null) { + Integer decode = Utils.crc32cCodec.decode(base64CumulativeCrc32c); + if (decode == 0) { + this.cumulativeCrc32c = Crc32cValue.zero(); + } else { + this.cumulativeCrc32c = Crc32cValue.of(decode); + } + this.hasher = Hasher.enabled(); + } } static JsonResumableWrite of( StorageObject req, Map options, String uploadId, long beginOffset) { - return new JsonResumableWrite(req, options, null, uploadId, beginOffset); + return of(req, options, uploadId, beginOffset, Hasher.noop(), null); + } + + static JsonResumableWrite of( + StorageObject req, + Map options, + String uploadId, + long beginOffset, + Hasher hasher, + Crc32cValue initialValue) { + return new JsonResumableWrite(req, hasher, initialValue, options, null, uploadId, beginOffset); } static JsonResumableWrite of(String signedUrl, String uploadId, long beginOffset) { - return new JsonResumableWrite(null, null, signedUrl, uploadId, beginOffset); + Hasher hasher = Hasher.noop(); + if (beginOffset == 0) { + hasher = Hasher.defaultHasher(); + } + return new JsonResumableWrite( + null, hasher, hasher.initialValue(), null, signedUrl, uploadId, beginOffset); } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java index 03ca85b9eb..4f80a7083d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClient.java @@ -24,6 +24,8 @@ import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; import com.google.cloud.storage.multipartupload.model.UploadPartRequest; @@ -99,6 +101,17 @@ public abstract CompleteMultipartUploadResponse completeMultipartUpload( @BetaApi public abstract UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requestBody); + /** + * Lists all multipart uploads in a bucket. + * + * @param request The request object containing the details for listing the multipart uploads. + * @return A {@link ListMultipartUploadsResponse} object containing the list of multipart uploads. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public abstract ListMultipartUploadsResponse listMultipartUploads( + ListMultipartUploadsRequest request); + /** * Creates a new instance of {@link MultipartUploadClient}. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java index d67ed8ab5a..2aecba6232 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadClientImpl.java @@ -23,6 +23,8 @@ import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; import com.google.cloud.storage.multipartupload.model.UploadPartRequest; @@ -96,4 +98,12 @@ public UploadPartResponse uploadPart(UploadPartRequest request, RequestBody requ }, Decoder.identity()); } + + @Override + public ListMultipartUploadsResponse listMultipartUploads(ListMultipartUploadsRequest request) { + return retrier.run( + retryAlgorithmManager.idempotent(), + () -> httpRequestManager.sendListMultipartUploadsRequest(request), + Decoder.identity()); + } } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java index 1c099ff1b5..15d48d66a4 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/MultipartUploadHttpRequestManager.java @@ -15,8 +15,6 @@ */ package com.google.cloud.storage; -import static com.google.cloud.storage.Utils.ifNonNull; - import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.google.api.client.http.ByteArrayContent; import com.google.api.client.http.GenericUrl; @@ -36,6 +34,8 @@ import com.google.cloud.storage.multipartupload.model.CompleteMultipartUploadResponse; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; import com.google.cloud.storage.multipartupload.model.UploadPartRequest; @@ -83,7 +83,7 @@ CreateMultipartUploadResponse sendCreateMultipartUploadRequest( HttpRequest httpRequest = requestFactory.buildPostRequest( - new GenericUrl(createUri), new ByteArrayContent(request.getContentType(), new byte[0])); + new GenericUrl(createUri), new ByteArrayContent(null, new byte[0])); httpRequest.getHeaders().putAll(headerProvider.getHeaders()); addHeadersForCreateMultipartUpload(request, httpRequest.getHeaders()); httpRequest.setParser(objectParser); @@ -98,11 +98,11 @@ ListPartsResponse sendListPartsRequest(ListPartsRequest request) throws IOExcept .put("bucket", request.bucket()) .put("key", request.key()) .put("uploadId", request.uploadId()); - if (request.getMaxParts() != null) { - params.put("max-parts", request.getMaxParts()); + if (request.maxParts() != null) { + params.put("max-parts", request.maxParts()); } - if (request.getPartNumberMarker() != null) { - params.put("part-number-marker", request.getPartNumberMarker()); + if (request.partNumberMarker() != null) { + params.put("part-number-marker", request.partNumberMarker()); } String listUri = @@ -113,11 +113,53 @@ ListPartsResponse sendListPartsRequest(ListPartsRequest request) throws IOExcept false); HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(listUri)); httpRequest.getHeaders().putAll(headerProvider.getHeaders()); + if (request.userProject() != null) { + httpRequest.getHeaders().put("x-goog-user-project", request.userProject()); + } httpRequest.setParser(objectParser); httpRequest.setThrowExceptionOnExecuteError(true); return httpRequest.execute().parseAs(ListPartsResponse.class); } + ListMultipartUploadsResponse sendListMultipartUploadsRequest(ListMultipartUploadsRequest request) + throws IOException { + + ImmutableMap.Builder params = + ImmutableMap.builder().put("bucket", request.bucket()); + if (request.delimiter() != null) { + params.put("delimiter", request.delimiter()); + } + if (request.encodingType() != null) { + params.put("encoding-type", request.encodingType()); + } + if (request.keyMarker() != null) { + params.put("key-marker", request.keyMarker()); + } + if (request.maxUploads() != null) { + params.put("max-uploads", request.maxUploads()); + } + if (request.prefix() != null) { + params.put("prefix", request.prefix()); + } + if (request.uploadIdMarker() != null) { + params.put("upload-id-marker", request.uploadIdMarker()); + } + String listUri = + UriTemplate.expand( + uri.toString() + + "{bucket}?uploads{&delimiter,encoding-type,key-marker,max-uploads,prefix,upload-id-marker}", + params.build(), + false); + HttpRequest httpRequest = requestFactory.buildGetRequest(new GenericUrl(listUri)); + httpRequest.getHeaders().putAll(headerProvider.getHeaders()); + if (request.userProject() != null) { + httpRequest.getHeaders().put("x-goog-user-project", request.userProject()); + } + httpRequest.setParser(objectParser); + httpRequest.setThrowExceptionOnExecuteError(true); + return httpRequest.execute().parseAs(ListMultipartUploadsResponse.class); + } + AbortMultipartUploadResponse sendAbortMultipartUploadRequest(AbortMultipartUploadRequest request) throws IOException { @@ -131,6 +173,9 @@ AbortMultipartUploadResponse sendAbortMultipartUploadRequest(AbortMultipartUploa HttpRequest httpRequest = requestFactory.buildDeleteRequest(new GenericUrl(abortUri)); httpRequest.getHeaders().putAll(headerProvider.getHeaders()); + if (request.userProject() != null) { + httpRequest.getHeaders().put("x-goog-user-project", request.userProject()); + } httpRequest.setParser(objectParser); httpRequest.setThrowExceptionOnExecuteError(true); return httpRequest.execute().parseAs(AbortMultipartUploadResponse.class); @@ -149,6 +194,9 @@ CompleteMultipartUploadResponse sendCompleteMultipartUploadRequest( requestFactory.buildPostRequest( new GenericUrl(completeUri), new ByteArrayContent("application/xml", bytes)); httpRequest.getHeaders().putAll(headerProvider.getHeaders()); + if (request.userProject() != null) { + httpRequest.getHeaders().put("x-goog-user-project", request.userProject()); + } @Nullable Crc32cLengthKnown crc32cValue = Hasher.defaultHasher().hash(ByteBuffer.wrap(bytes)); addChecksumHeader(crc32cValue, httpRequest.getHeaders()); httpRequest.setParser(objectParser); @@ -174,8 +222,11 @@ UploadPartResponse sendUploadPartRequest( HttpRequest httpRequest = requestFactory.buildPutRequest(new GenericUrl(uploadUri), rewindableContent); httpRequest.getHeaders().putAll(headerProvider.getHeaders()); - if (request.getCrc32c() != null) { - addChecksumHeader(request.getCrc32c(), httpRequest.getHeaders()); + if (request.userProject() != null) { + httpRequest.getHeaders().put("x-goog-user-project", request.userProject()); + } + if (request.crc32c() != null) { + addChecksumHeader(request.crc32c(), httpRequest.getHeaders()); } else { addChecksumHeader(rewindableContent.getCrc32c(), httpRequest.getHeaders()); } @@ -198,12 +249,15 @@ static MultipartUploadHttpRequestManager createFrom(HttpStorageOptions options) options.getLibraryVersion(), formatName(StandardSystemProperty.OS_NAME.value()), formatSemver(StandardSystemProperty.OS_VERSION.value()))); - ifNonNull(options.getProjectId(), pid -> stableHeaders.put("x-goog-user-project", pid)); return new MultipartUploadHttpRequestManager( storage.getRequestFactory(), new XmlObjectParser(new XmlMapper()), options.getMergedHeaderProvider(FixedHeaderProvider.create(stableHeaders.build())), - URI.create(options.getHost())); + URI.create(ensureTrailingSlash(options.getHost()))); + } + + private static String ensureTrailingSlash(String host) { + return host.endsWith("/") ? host : host + "/"; } private void addChecksumHeader(@Nullable Crc32cLengthKnown crc32c, HttpHeaders headers) { @@ -220,51 +274,51 @@ private void addChecksumHeader(@Nullable String crc32c, HttpHeaders headers) { private void addHeadersForCreateMultipartUpload( CreateMultipartUploadRequest request, HttpHeaders headers) { - if (request.getCannedAcl() != null) { - headers.put("x-goog-acl", request.getCannedAcl().getXmlEntry()); + if (request.cannedAcl() != null) { + headers.put("x-goog-acl", request.cannedAcl().getXmlEntry()); } - if (request.getMetadata() != null) { - for (Map.Entry entry : request.getMetadata().entrySet()) { + if (request.metadata() != null) { + for (Map.Entry entry : request.metadata().entrySet()) { if (entry.getKey() != null || entry.getValue() != null) { headers.put("x-goog-meta-" + urlEncode(entry.getKey()), urlEncode(entry.getValue())); } } } - if (request.getContentType() != null) { - headers.put("Content-Type", request.getContentType()); + if (request.contentType() != null) { + headers.put("Content-Type", request.contentType()); } - if (request.getContentDisposition() != null) { - headers.put("Content-Disposition", request.getContentDisposition()); + if (request.contentDisposition() != null) { + headers.put("Content-Disposition", request.contentDisposition()); } - if (request.getContentEncoding() != null) { - headers.put("Content-Encoding", request.getContentEncoding()); + if (request.contentEncoding() != null) { + headers.put("Content-Encoding", request.contentEncoding()); } - if (request.getContentLanguage() != null) { - headers.put("Content-Language", request.getContentLanguage()); + if (request.contentLanguage() != null) { + headers.put("Content-Language", request.contentLanguage()); } - if (request.getCacheControl() != null) { - headers.put("Cache-Control", request.getCacheControl()); + if (request.cacheControl() != null) { + headers.put("Cache-Control", request.cacheControl()); } - if (request.getStorageClass() != null) { - headers.put("x-goog-storage-class", request.getStorageClass().toString()); + if (request.storageClass() != null) { + headers.put("x-goog-storage-class", request.storageClass().toString()); } - if (request.getKmsKeyName() != null && !request.getKmsKeyName().isEmpty()) { - headers.put("x-goog-encryption-kms-key-name", request.getKmsKeyName()); + if (request.kmsKeyName() != null && !request.kmsKeyName().isEmpty()) { + headers.put("x-goog-encryption-kms-key-name", request.kmsKeyName()); } - if (request.getObjectLockMode() != null) { - headers.put("x-goog-object-lock-mode", request.getObjectLockMode().toString()); + if (request.objectLockMode() != null) { + headers.put("x-goog-object-lock-mode", request.objectLockMode().toString()); } - if (request.getObjectLockRetainUntilDate() != null) { + if (request.objectLockRetainUntilDate() != null) { headers.put( "x-goog-object-lock-retain-until-date", - Utils.offsetDateTimeRfc3339Codec.encode(request.getObjectLockRetainUntilDate())); + Utils.offsetDateTimeRfc3339Codec.encode(request.objectLockRetainUntilDate())); } - if (request.getCustomTime() != null) { + if (request.customTime() != null) { headers.put( - "x-goog-custom-time", Utils.offsetDateTimeRfc3339Codec.encode(request.getCustomTime())); + "x-goog-custom-time", Utils.offsetDateTimeRfc3339Codec.encode(request.customTime())); } - if (request.getUserProject() != null) { - headers.put("x-goog-user-project", request.getUserProject()); + if (request.userProject() != null) { + headers.put("x-goog-user-project", request.userProject()); } } @@ -282,7 +336,7 @@ private static String urlEncode(String value) { */ private static String formatName(String name) { // Only lowercase letters, digits, and "-" are allowed - return name.toLowerCase().replaceAll("[^\\w\\d\\-]", "-"); + return name.toLowerCase().replaceAll("[^\\w-]", "-"); } private static String formatSemver(String version) { diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java index 23e94e09f5..12ac95dff7 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java @@ -2470,6 +2470,11 @@ public static BucketListOption pageSize(long pageSize) { return new BucketListOption(UnifiedOpts.pageSize(pageSize)); } + @TransportCompatibility({Transport.HTTP, Transport.GRPC}) + public static BucketListOption returnPartialSuccess(boolean returnPartialSuccess) { + return new BucketListOption(UnifiedOpts.returnPartialSuccess(returnPartialSuccess)); + } + /** Returns an option to specify the page token from which to start listing buckets. */ @TransportCompatibility({Transport.HTTP, Transport.GRPC}) public static BucketListOption pageToken(@NonNull String pageToken) { 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 d4d4217840..ebc4cbe5d7 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 @@ -216,7 +216,13 @@ public Blob createFrom(BlobInfo blobInfo, Path path, int bufferSize, BlobWriteOp optionsMap, retrier.withAlg(retryAlgorithmManager.getForResumableUploadSessionCreate(optionsMap))); JsonResumableWrite jsonResumableWrite = - JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + JsonResumableWrite.of( + encode, + optionsMap, + uploadIdSupplier.get(), + 0, + opts.getHasher(), + opts.getHasher().initialValue()); JsonResumableSession session = ResumableSession.json( @@ -762,7 +768,13 @@ public StorageWriteChannel writer(BlobInfo blobInfo, BlobWriteOption... options) optionsMap, retrier.withAlg(retryAlgorithmManager.getForResumableUploadSessionCreate(optionsMap))); JsonResumableWrite jsonResumableWrite = - JsonResumableWrite.of(encode, optionsMap, uploadIdSupplier.get(), 0); + JsonResumableWrite.of( + encode, + optionsMap, + uploadIdSupplier.get(), + 0, + opts.getHasher(), + opts.getHasher().initialValue()); return new BlobWriteChannelV2(BlobReadChannelContext.from(this), jsonResumableWrite); } @@ -1724,7 +1736,13 @@ public BlobInfo internalCreateFrom(Path path, BlobInfo info, Opts listObjects() { } } + static final class ReturnPartialSuccess extends RpcOptVal implements BucketListOpt { + private static final long serialVersionUID = -1370658416509499277L; + + private ReturnPartialSuccess(boolean val) { + super(StorageRpc.Option.RETURN_PARTIAL_SUCCESS, val); + } + + @Override + public Mapper listBuckets() { + return b -> b.setReturnPartialSuccess(val); + } + } + static final class PredefinedAcl extends RpcOptVal implements BucketTargetOpt, ObjectTargetOpt { private static final long serialVersionUID = -1743736785228368741L; diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/UploadFailureScenario.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/UploadFailureScenario.java index a8312cc19b..5335ce19cf 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/UploadFailureScenario.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/UploadFailureScenario.java @@ -93,6 +93,7 @@ enum UploadFailureScenario { .or(matches("Range")) .or(startsWith("X-Goog-Stored-")) .or(matches("X-Goog-GCS-Idempotency-Token")) + .or(matches("X-Goog-Hash")) .or(matches("X-Goog-request-params")) .or(matches("X-GUploader-UploadID")); diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java index 2da671ff7d..8dddf99d1d 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/AbortMultipartUploadRequest.java @@ -28,11 +28,13 @@ public final class AbortMultipartUploadRequest { private final String bucket; private final String key; private final String uploadId; + private final String userProject; private AbortMultipartUploadRequest(Builder builder) { this.bucket = builder.bucket; this.key = builder.key; this.uploadId = builder.uploadId; + this.userProject = builder.userProject; } /** @@ -68,6 +70,19 @@ public String uploadId() { return uploadId; } + /** + * Returns the user-project. + * + * @return the user-project. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String userProject() { + return userProject; + } + /** * Returns a new builder for creating {@link AbortMultipartUploadRequest} instances. * @@ -89,6 +104,7 @@ public static class Builder { private String bucket; private String key; private String uploadId; + private String userProject; private Builder() {} @@ -131,6 +147,21 @@ public Builder uploadId(String uploadId) { return this; } + /** + * Sets the user-project. + * + * @param userProject The user-project. + * @return This builder. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder userProject(String userProject) { + this.userProject = userProject; + return this; + } + /** * Builds a new {@link AbortMultipartUploadRequest} instance. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CompleteMultipartUploadRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CompleteMultipartUploadRequest.java index 291a10d3af..4f7a6a4cb0 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CompleteMultipartUploadRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CompleteMultipartUploadRequest.java @@ -32,12 +32,14 @@ public final class CompleteMultipartUploadRequest { private final String key; private final String uploadId; private final CompletedMultipartUpload multipartUpload; + private final String userProject; private CompleteMultipartUploadRequest(Builder builder) { this.bucket = builder.bucket; this.key = builder.key; this.uploadId = builder.uploadId; this.multipartUpload = builder.multipartUpload; + this.userProject = builder.userProject; } /** @@ -84,6 +86,19 @@ public CompletedMultipartUpload multipartUpload() { return multipartUpload; } + /** + * Returns the user-project. + * + * @return the user-project. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String userProject() { + return userProject; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -96,12 +111,13 @@ public boolean equals(Object o) { return Objects.equals(bucket, that.bucket) && Objects.equals(key, that.key) && Objects.equals(uploadId, that.uploadId) - && Objects.equals(multipartUpload, that.multipartUpload); + && Objects.equals(multipartUpload, that.multipartUpload) + && Objects.equals(userProject, that.userProject); } @Override public int hashCode() { - return Objects.hash(bucket, key, uploadId, multipartUpload); + return Objects.hash(bucket, key, uploadId, multipartUpload, userProject); } @Override @@ -111,6 +127,7 @@ public String toString() { .add("key", key) .add("uploadId", uploadId) .add("completedMultipartUpload", multipartUpload) + .add("userProject", userProject) .toString(); } @@ -136,6 +153,7 @@ public static class Builder { private String key; private String uploadId; private CompletedMultipartUpload multipartUpload; + private String userProject; private Builder() {} @@ -191,6 +209,21 @@ public Builder multipartUpload(CompletedMultipartUpload completedMultipartUpload return this; } + /** + * Sets the user-project. + * + * @param userProject The user-project. + * @return This builder. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder userProject(String userProject) { + this.userProject = userProject; + return this; + } + /** * Builds the {@link CompleteMultipartUploadRequest} object. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest.java index ab314ee2a6..4b58c6ec55 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/CreateMultipartUploadRequest.java @@ -96,7 +96,7 @@ public String key() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public PredefinedAcl getCannedAcl() { + public PredefinedAcl cannedAcl() { return cannedAcl; } @@ -107,7 +107,7 @@ public PredefinedAcl getCannedAcl() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getContentType() { + public String contentType() { return contentType; } @@ -118,7 +118,7 @@ public String getContentType() { * @since 2.61.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getContentDisposition() { + public String contentDisposition() { return contentDisposition; } @@ -129,7 +129,7 @@ public String getContentDisposition() { * @since 2.61.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getContentEncoding() { + public String contentEncoding() { return contentEncoding; } @@ -140,7 +140,7 @@ public String getContentEncoding() { * @since 2.61.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getContentLanguage() { + public String contentLanguage() { return contentLanguage; } @@ -152,7 +152,7 @@ public String getContentLanguage() { * @since 2.61.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getCacheControl() { + public String cacheControl() { return cacheControl; } @@ -163,7 +163,7 @@ public String getCacheControl() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Map getMetadata() { + public Map metadata() { return metadata; } @@ -174,7 +174,7 @@ public Map getMetadata() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public StorageClass getStorageClass() { + public StorageClass storageClass() { return storageClass; } @@ -185,7 +185,7 @@ public StorageClass getStorageClass() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public OffsetDateTime getCustomTime() { + public OffsetDateTime customTime() { return customTime; } @@ -196,7 +196,7 @@ public OffsetDateTime getCustomTime() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getKmsKeyName() { + public String kmsKeyName() { return kmsKeyName; } @@ -207,7 +207,7 @@ public String getKmsKeyName() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public ObjectLockMode getObjectLockMode() { + public ObjectLockMode objectLockMode() { return objectLockMode; } @@ -218,7 +218,7 @@ public ObjectLockMode getObjectLockMode() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public OffsetDateTime getObjectLockRetainUntilDate() { + public OffsetDateTime objectLockRetainUntilDate() { return objectLockRetainUntilDate; } @@ -228,7 +228,7 @@ public OffsetDateTime getObjectLockRetainUntilDate() { * @return The user project * @since 2.61.0 This new api is in preview and is subject to breaking changes. */ - public String getUserProject() { + public String userProject() { return userProject; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsRequest.java new file mode 100644 index 0000000000..17e1a924dd --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsRequest.java @@ -0,0 +1,353 @@ +/* + * Copyright 2025 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.multipartupload.model; + +import com.google.api.core.BetaApi; +import com.google.common.base.MoreObjects; +import java.util.Objects; + +/** + * A request to list all multipart uploads in a bucket. + * + * @see Listing + * multipart uploads + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ +@BetaApi +public final class ListMultipartUploadsRequest { + + private final String bucket; + private final String delimiter; + private final String encodingType; + private final String keyMarker; + private final Integer maxUploads; + private final String prefix; + private final String uploadIdMarker; + private final String userProject; + + private ListMultipartUploadsRequest( + String bucket, + String delimiter, + String encodingType, + String keyMarker, + Integer maxUploads, + String prefix, + String uploadIdMarker, + String userProject) { + this.bucket = bucket; + this.delimiter = delimiter; + this.encodingType = encodingType; + this.keyMarker = keyMarker; + this.maxUploads = maxUploads; + this.prefix = prefix; + this.uploadIdMarker = uploadIdMarker; + this.userProject = userProject; + } + + /** + * The bucket to list multipart uploads from. + * + * @return The bucket name. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String bucket() { + return bucket; + } + + /** + * Character used to group keys. + * + * @return The delimiter. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String delimiter() { + return delimiter; + } + + /** + * The encoding type used by Cloud Storage to encode object names in the response. + * + * @return The encoding type. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String encodingType() { + return encodingType; + } + + /** + * Together with {@code upload-id-marker}, specifies the multipart upload after which listing + * should begin. + * + * @return The key marker. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String keyMarker() { + return keyMarker; + } + + /** + * The maximum number of multipart uploads to return. + * + * @return The maximum number of uploads. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Integer maxUploads() { + return maxUploads; + } + + /** + * Filters results to multipart uploads whose keys begin with this prefix. + * + * @return The prefix. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String prefix() { + return prefix; + } + + /** + * Together with {@code key-marker}, specifies the multipart upload after which listing should + * begin. + * + * @return The upload ID marker. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String uploadIdMarker() { + return uploadIdMarker; + } + + /** + * Returns the user-project. + * + * @return the user-project. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String userProject() { + return userProject; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ListMultipartUploadsRequest that = (ListMultipartUploadsRequest) o; + return Objects.equals(bucket, that.bucket) + && Objects.equals(delimiter, that.delimiter) + && Objects.equals(encodingType, that.encodingType) + && Objects.equals(keyMarker, that.keyMarker) + && Objects.equals(maxUploads, that.maxUploads) + && Objects.equals(prefix, that.prefix) + && Objects.equals(uploadIdMarker, that.uploadIdMarker) + && Objects.equals(userProject, that.userProject); + } + + @Override + public int hashCode() { + return Objects.hash( + bucket, + delimiter, + encodingType, + keyMarker, + maxUploads, + prefix, + uploadIdMarker, + userProject); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("bucket", bucket) + .add("delimiter", delimiter) + .add("encodingType", encodingType) + .add("keyMarker", keyMarker) + .add("maxUploads", maxUploads) + .add("prefix", prefix) + .add("uploadIdMarker", uploadIdMarker) + .add("userProject", userProject) + .toString(); + } + + /** + * Returns a new builder for this request. + * + * @return A new builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static Builder builder() { + return new Builder(); + } + + /** + * A builder for {@link ListMultipartUploadsRequest}. + * + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static final class Builder { + private String bucket; + private String delimiter; + private String encodingType; + private String keyMarker; + private Integer maxUploads; + private String prefix; + private String uploadIdMarker; + private String userProject; + + private Builder() {} + + /** + * Sets the bucket to list multipart uploads from. + * + * @param bucket The bucket name. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder bucket(String bucket) { + this.bucket = bucket; + return this; + } + + /** + * Sets the delimiter used to group keys. + * + * @param delimiter The delimiter. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder delimiter(String delimiter) { + this.delimiter = delimiter; + return this; + } + + /** + * Sets the encoding type used by Cloud Storage to encode object names in the response. + * + * @param encodingType The encoding type. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder encodingType(String encodingType) { + this.encodingType = encodingType; + return this; + } + + /** + * Sets the key marker. + * + * @param keyMarker The key marker. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder keyMarker(String keyMarker) { + this.keyMarker = keyMarker; + return this; + } + + /** + * Sets the maximum number of multipart uploads to return. + * + * @param maxUploads The maximum number of uploads. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder maxUploads(Integer maxUploads) { + this.maxUploads = maxUploads; + return this; + } + + /** + * Sets the prefix to filter results. + * + * @param prefix The prefix. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder prefix(String prefix) { + this.prefix = prefix; + return this; + } + + /** + * Sets the upload ID marker. + * + * @param uploadIdMarker The upload ID marker. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder uploadIdMarker(String uploadIdMarker) { + this.uploadIdMarker = uploadIdMarker; + return this; + } + + /** + * Sets the user-project. + * + * @param userProject The user-project. + * @return This builder. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder userProject(String userProject) { + this.userProject = userProject; + return this; + } + + /** + * Builds the request. + * + * @return The built request. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public ListMultipartUploadsRequest build() { + return new ListMultipartUploadsRequest( + bucket, + delimiter, + encodingType, + keyMarker, + maxUploads, + prefix, + uploadIdMarker, + userProject); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsResponse.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsResponse.java new file mode 100644 index 0000000000..d43184bc15 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListMultipartUploadsResponse.java @@ -0,0 +1,525 @@ +/* + * Copyright 2025 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.multipartupload.model; + +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.google.api.core.BetaApi; +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * A response from listing all multipart uploads in a bucket. + * + * @see Listing + * multipart uploads + * @since 2.60.1 This new api is in preview and is subject to breaking changes. + */ +@BetaApi +public final class ListMultipartUploadsResponse { + + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "Upload") + private List uploads; + + @JacksonXmlProperty(localName = "Bucket") + private String bucket; + + @JacksonXmlProperty(localName = "Delimiter") + private String delimiter; + + @JacksonXmlProperty(localName = "EncodingType") + private String encodingType; + + @JacksonXmlProperty(localName = "KeyMarker") + private String keyMarker; + + @JacksonXmlProperty(localName = "UploadIdMarker") + private String uploadIdMarker; + + @JacksonXmlProperty(localName = "NextKeyMarker") + private String nextKeyMarker; + + @JacksonXmlProperty(localName = "NextUploadIdMarker") + private String nextUploadIdMarker; + + @JacksonXmlProperty(localName = "MaxUploads") + private int maxUploads; + + @JacksonXmlProperty(localName = "Prefix") + private String prefix; + + @JsonAlias("truncated") + @JacksonXmlProperty(localName = "IsTruncated") + private boolean isTruncated; + + @JacksonXmlElementWrapper(useWrapping = false) + @JacksonXmlProperty(localName = "CommonPrefixes") + private List commonPrefixes; + + // Jackson requires a no-arg constructor + private ListMultipartUploadsResponse() {} + + private ListMultipartUploadsResponse( + List uploads, + String bucket, + String delimiter, + String encodingType, + String keyMarker, + String uploadIdMarker, + String nextKeyMarker, + String nextUploadIdMarker, + int maxUploads, + String prefix, + boolean isTruncated, + List commonPrefixes) { + this.uploads = uploads; + this.bucket = bucket; + this.delimiter = delimiter; + this.encodingType = encodingType; + this.keyMarker = keyMarker; + this.uploadIdMarker = uploadIdMarker; + this.nextKeyMarker = nextKeyMarker; + this.nextUploadIdMarker = nextUploadIdMarker; + this.maxUploads = maxUploads; + this.prefix = prefix; + this.isTruncated = isTruncated; + if (commonPrefixes != null) { + this.commonPrefixes = new ArrayList<>(); + for (String p : commonPrefixes) { + CommonPrefixHelper h = new CommonPrefixHelper(); + h.prefix = p; + this.commonPrefixes.add(h); + } + } + } + + /** + * The list of multipart uploads. + * + * @return The list of multipart uploads. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public ImmutableList uploads() { + return uploads == null ? ImmutableList.of() : ImmutableList.copyOf(uploads); + } + + /** + * The bucket that contains the multipart uploads. + * + * @return The bucket name. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String bucket() { + return bucket; + } + + /** + * The delimiter applied to the request. + * + * @return The delimiter applied to the request. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String delimiter() { + return delimiter; + } + + /** + * The encoding type used by Cloud Storage to encode object names in the response. + * + * @return The encoding type. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String encodingType() { + return encodingType; + } + + /** + * The key at or after which the listing began. + * + * @return The key marker. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String keyMarker() { + return keyMarker; + } + + /** + * The upload ID at or after which the listing began. + * + * @return The upload ID marker. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String uploadIdMarker() { + return uploadIdMarker; + } + + /** + * The key after which listing should begin. + * + * @return The key after which listing should begin. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String nextKeyMarker() { + return nextKeyMarker; + } + + /** + * The upload ID after which listing should begin. + * + * @return The upload ID after which listing should begin. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String nextUploadIdMarker() { + return nextUploadIdMarker; + } + + /** + * The maximum number of uploads to return. + * + * @return The maximum number of uploads. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public int maxUploads() { + return maxUploads; + } + + /** + * The prefix applied to the request. + * + * @return The prefix applied to the request. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String prefix() { + return prefix; + } + + /** + * A flag indicating whether or not the returned results are truncated. + * + * @return A flag indicating whether or not the returned results are truncated. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public boolean truncated() { + return isTruncated; + } + + /** + * If you specify a delimiter in the request, this element is returned. + * + * @return The common prefixes. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public ImmutableList commonPrefixes() { + if (commonPrefixes == null) { + return ImmutableList.of(); + } + return commonPrefixes.stream().map(h -> h.prefix).collect(ImmutableList.toImmutableList()); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ListMultipartUploadsResponse that = (ListMultipartUploadsResponse) o; + return isTruncated == that.isTruncated + && maxUploads == that.maxUploads + && Objects.equals(uploads(), that.uploads()) + && Objects.equals(bucket, that.bucket) + && Objects.equals(delimiter, that.delimiter) + && Objects.equals(encodingType, that.encodingType) + && Objects.equals(keyMarker, that.keyMarker) + && Objects.equals(uploadIdMarker, that.uploadIdMarker) + && Objects.equals(nextKeyMarker, that.nextKeyMarker) + && Objects.equals(nextUploadIdMarker, that.nextUploadIdMarker) + && Objects.equals(prefix, that.prefix) + && Objects.equals(commonPrefixes(), that.commonPrefixes()); + } + + @Override + public int hashCode() { + return Objects.hash( + uploads(), + bucket, + delimiter, + encodingType, + keyMarker, + uploadIdMarker, + nextKeyMarker, + nextUploadIdMarker, + maxUploads, + prefix, + isTruncated, + commonPrefixes()); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("uploads", uploads()) + .add("bucket", bucket) + .add("delimiter", delimiter) + .add("encodingType", encodingType) + .add("keyMarker", keyMarker) + .add("uploadIdMarker", uploadIdMarker) + .add("nextKeyMarker", nextKeyMarker) + .add("nextUploadIdMarker", nextUploadIdMarker) + .add("maxUploads", maxUploads) + .add("prefix", prefix) + .add("isTruncated", isTruncated) + .add("commonPrefixes", commonPrefixes()) + .toString(); + } + + /** + * Returns a new builder for this response. + * + * @return A new builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static Builder builder() { + return new Builder(); + } + + static class CommonPrefixHelper { + @JacksonXmlProperty(localName = "Prefix") + public String prefix; + } + + /** + * A builder for {@link ListMultipartUploadsResponse}. + * + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static final class Builder { + private ImmutableList uploads; + private String bucket; + private String delimiter; + private String encodingType; + private String keyMarker; + private String uploadIdMarker; + private String nextKeyMarker; + private String nextUploadIdMarker; + private int maxUploads; + private String prefix; + private boolean isTruncated; + private ImmutableList commonPrefixes; + + private Builder() {} + + /** + * Sets the list of multipart uploads. + * + * @param uploads The list of multipart uploads. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder uploads(ImmutableList uploads) { + this.uploads = uploads; + return this; + } + + /** + * Sets the bucket that contains the multipart uploads. + * + * @param bucket The bucket name. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder bucket(String bucket) { + this.bucket = bucket; + return this; + } + + /** + * Sets the delimiter applied to the request. + * + * @param delimiter The delimiter applied to the request. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder delimiter(String delimiter) { + this.delimiter = delimiter; + return this; + } + + /** + * Sets the encoding type used by Cloud Storage to encode object names in the response. + * + * @param encodingType The encoding type. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder encodingType(String encodingType) { + this.encodingType = encodingType; + return this; + } + + /** + * Sets the key at or after which the listing began. + * + * @param keyMarker The key marker. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder keyMarker(String keyMarker) { + this.keyMarker = keyMarker; + return this; + } + + /** + * Sets the upload ID at or after which the listing began. + * + * @param uploadIdMarker The upload ID marker. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder uploadIdMarker(String uploadIdMarker) { + this.uploadIdMarker = uploadIdMarker; + return this; + } + + /** + * Sets the key after which listing should begin. + * + * @param nextKeyMarker The key after which listing should begin. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder nextKeyMarker(String nextKeyMarker) { + this.nextKeyMarker = nextKeyMarker; + return this; + } + + /** + * Sets the upload ID after which listing should begin. + * + * @param nextUploadIdMarker The upload ID after which listing should begin. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder nextUploadIdMarker(String nextUploadIdMarker) { + this.nextUploadIdMarker = nextUploadIdMarker; + return this; + } + + /** + * Sets the maximum number of uploads to return. + * + * @param maxUploads The maximum number of uploads. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder maxUploads(int maxUploads) { + this.maxUploads = maxUploads; + return this; + } + + /** + * Sets the prefix applied to the request. + * + * @param prefix The prefix applied to the request. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder prefix(String prefix) { + this.prefix = prefix; + return this; + } + + /** + * Sets the flag indicating whether or not the returned results are truncated. + * + * @param isTruncated The flag indicating whether or not the returned results are truncated. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder truncated(boolean isTruncated) { + this.isTruncated = isTruncated; + return this; + } + + /** + * If you specify a delimiter in the request, this element is returned. + * + * @param commonPrefixes The common prefixes. + * @return This builder. + * @since 2.61.0 This new api is in preview. + */ + @BetaApi + public Builder commonPrefixes(ImmutableList commonPrefixes) { + this.commonPrefixes = commonPrefixes; + return this; + } + + /** + * Builds the response. + * + * @return The built response. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public ListMultipartUploadsResponse build() { + return new ListMultipartUploadsResponse( + uploads, + bucket, + delimiter, + encodingType, + keyMarker, + uploadIdMarker, + nextKeyMarker, + nextUploadIdMarker, + maxUploads, + prefix, + isTruncated, + commonPrefixes); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsRequest.java index 2062bdfeb2..871f1778ac 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsRequest.java @@ -37,12 +37,15 @@ public final class ListPartsRequest { private final Integer partNumberMarker; + private final String userProject; + private ListPartsRequest(Builder builder) { this.bucket = builder.bucket; this.key = builder.key; this.uploadId = builder.uploadId; this.maxParts = builder.maxParts; this.partNumberMarker = builder.partNumberMarker; + this.userProject = builder.userProject; } /** @@ -85,7 +88,7 @@ public String uploadId() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Integer getMaxParts() { + public Integer maxParts() { return maxParts; } @@ -96,10 +99,23 @@ public Integer getMaxParts() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Integer getPartNumberMarker() { + public Integer partNumberMarker() { return partNumberMarker; } + /** + * Returns the user-project. + * + * @return the user-project. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String userProject() { + return userProject; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -113,12 +129,13 @@ public boolean equals(Object o) { && Objects.equals(key, that.key) && Objects.equals(uploadId, that.uploadId) && Objects.equals(maxParts, that.maxParts) - && Objects.equals(partNumberMarker, that.partNumberMarker); + && Objects.equals(partNumberMarker, that.partNumberMarker) + && Objects.equals(userProject, that.userProject); } @Override public int hashCode() { - return Objects.hash(bucket, key, uploadId, maxParts, partNumberMarker); + return Objects.hash(bucket, key, uploadId, maxParts, partNumberMarker, userProject); } @Override @@ -129,6 +146,7 @@ public String toString() { .add("uploadId", uploadId) .add("maxParts", maxParts) .add("partNumberMarker", partNumberMarker) + .add("userProject", userProject) .toString(); } @@ -155,6 +173,7 @@ public static class Builder { private String uploadId; private Integer maxParts; private Integer partNumberMarker; + private String userProject; private Builder() {} @@ -223,6 +242,21 @@ public Builder partNumberMarker(Integer partNumberMarker) { return this; } + /** + * Sets the user-project. + * + * @param userProject The user-project. + * @return This builder. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder userProject(String userProject) { + this.userProject = userProject; + return this; + } + /** * Builds a new {@link ListPartsRequest} object. * diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsResponse.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsResponse.java index 0b8f82c5a0..b9625a4c50 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsResponse.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/ListPartsResponse.java @@ -94,7 +94,7 @@ public static Builder builder() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getBucket() { + public String bucket() { return bucket; } @@ -105,7 +105,7 @@ public String getBucket() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getKey() { + public String key() { return key; } @@ -116,7 +116,7 @@ public String getKey() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public String getUploadId() { + public String uploadId() { return uploadId; } @@ -127,7 +127,7 @@ public String getUploadId() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public int getPartNumberMarker() { + public int partNumberMarker() { return partNumberMarker; } @@ -138,7 +138,7 @@ public int getPartNumberMarker() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public int getNextPartNumberMarker() { + public int nextPartNumberMarker() { return nextPartNumberMarker; } @@ -149,7 +149,7 @@ public int getNextPartNumberMarker() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public int getMaxParts() { + public int maxParts() { return maxParts; } @@ -160,7 +160,7 @@ public int getMaxParts() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public boolean isTruncated() { + public boolean truncated() { return isTruncated; } @@ -171,7 +171,7 @@ public boolean isTruncated() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public StorageClass getStorageClass() { + public StorageClass storageClass() { return storageClass; } @@ -182,7 +182,7 @@ public StorageClass getStorageClass() { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public List getParts() { + public List parts() { return parts; } @@ -262,7 +262,7 @@ private Builder() {} * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setBucket(String bucket) { + public Builder bucket(String bucket) { this.bucket = bucket; return this; } @@ -275,7 +275,7 @@ public Builder setBucket(String bucket) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setKey(String key) { + public Builder key(String key) { this.key = key; return this; } @@ -288,7 +288,7 @@ public Builder setKey(String key) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setUploadId(String uploadId) { + public Builder uploadId(String uploadId) { this.uploadId = uploadId; return this; } @@ -301,7 +301,7 @@ public Builder setUploadId(String uploadId) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setPartNumberMarker(int partNumberMarker) { + public Builder partNumberMarker(int partNumberMarker) { this.partNumberMarker = partNumberMarker; return this; } @@ -314,7 +314,7 @@ public Builder setPartNumberMarker(int partNumberMarker) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setNextPartNumberMarker(int nextPartNumberMarker) { + public Builder nextPartNumberMarker(int nextPartNumberMarker) { this.nextPartNumberMarker = nextPartNumberMarker; return this; } @@ -327,7 +327,7 @@ public Builder setNextPartNumberMarker(int nextPartNumberMarker) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setMaxParts(int maxParts) { + public Builder maxParts(int maxParts) { this.maxParts = maxParts; return this; } @@ -340,7 +340,7 @@ public Builder setMaxParts(int maxParts) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setIsTruncated(boolean isTruncated) { + public Builder truncated(boolean isTruncated) { this.isTruncated = isTruncated; return this; } @@ -353,7 +353,7 @@ public Builder setIsTruncated(boolean isTruncated) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setStorageClass(StorageClass storageClass) { + public Builder storageClass(StorageClass storageClass) { this.storageClass = storageClass; return this; } @@ -366,7 +366,7 @@ public Builder setStorageClass(StorageClass storageClass) { * @since 2.60.0 This new api is in preview and is subject to breaking changes. */ @BetaApi - public Builder setParts(List parts) { + public Builder parts(List parts) { this.parts = parts; return this; } diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/MultipartUpload.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/MultipartUpload.java new file mode 100644 index 0000000000..26a44fb2f0 --- /dev/null +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/MultipartUpload.java @@ -0,0 +1,218 @@ +/* + * Copyright 2025 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.multipartupload.model; + +import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; +import com.google.api.core.BetaApi; +import com.google.cloud.storage.StorageClass; +import com.google.common.base.MoreObjects; +import java.time.OffsetDateTime; +import java.util.Objects; + +/** + * Represents a multipart upload that is in progress. + * + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ +@BetaApi +public final class MultipartUpload { + + @JacksonXmlProperty(localName = "Key") + private String key; + + @JacksonXmlProperty(localName = "UploadId") + private String uploadId; + + @JacksonXmlProperty(localName = "StorageClass") + private StorageClass storageClass; + + @JacksonXmlProperty(localName = "Initiated") + private OffsetDateTime initiated; + + private MultipartUpload() {} + + private MultipartUpload( + String key, String uploadId, StorageClass storageClass, OffsetDateTime initiated) { + this.key = key; + this.uploadId = uploadId; + this.storageClass = storageClass; + this.initiated = initiated; + } + + /** + * The object name for which the multipart upload was initiated. + * + * @return The object name. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String key() { + return key; + } + + /** + * The ID of the multipart upload. + * + * @return The upload ID. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String uploadId() { + return uploadId; + } + + /** + * The storage class of the object. + * + * @return The storage class. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public StorageClass storageClass() { + return storageClass; + } + + /** + * The date and time at which the multipart upload was initiated. + * + * @return The initiation date and time. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public OffsetDateTime initiated() { + return initiated; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MultipartUpload that = (MultipartUpload) o; + return Objects.equals(key, that.key) + && Objects.equals(uploadId, that.uploadId) + && Objects.equals(storageClass, that.storageClass) + && Objects.equals(initiated, that.initiated); + } + + @Override + public int hashCode() { + return Objects.hash(key, uploadId, storageClass, initiated); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("key", key) + .add("uploadId", uploadId) + .add("storageClass", storageClass) + .add("initiated", initiated) + .toString(); + } + + /** + * Returns a new builder for this multipart upload. + * + * @return A new builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static Builder newBuilder() { + return new Builder(); + } + + /** + * A builder for {@link MultipartUpload}. + * + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public static final class Builder { + private String key; + private String uploadId; + private StorageClass storageClass; + private OffsetDateTime initiated; + + private Builder() {} + + /** + * Sets the object name for which the multipart upload was initiated. + * + * @param key The object name. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder key(String key) { + this.key = key; + return this; + } + + /** + * Sets the ID of the multipart upload. + * + * @param uploadId The upload ID. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder uploadId(String uploadId) { + this.uploadId = uploadId; + return this; + } + + /** + * Sets the storage class of the object. + * + * @param storageClass The storage class. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder storageClass(StorageClass storageClass) { + this.storageClass = storageClass; + return this; + } + + /** + * Sets the date and time at which the multipart upload was initiated. + * + * @param initiated The initiation date and time. + * @return This builder. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder initiated(OffsetDateTime initiated) { + this.initiated = initiated; + return this; + } + + /** + * Builds the multipart upload. + * + * @return The built multipart upload. + * @since 2.61.0 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public MultipartUpload build() { + return new MultipartUpload(key, uploadId, storageClass, initiated); + } + } +} diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/UploadPartRequest.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/UploadPartRequest.java index 59af2df211..714afc9013 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/UploadPartRequest.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/multipartupload/model/UploadPartRequest.java @@ -35,6 +35,7 @@ public final class UploadPartRequest { private final int partNumber; private final String uploadId; @Nullable private final String crc32c; + private final String userProject; private UploadPartRequest(Builder builder) { this.bucket = builder.bucket; @@ -42,6 +43,7 @@ private UploadPartRequest(Builder builder) { this.partNumber = builder.partNumber; this.uploadId = builder.uploadId; this.crc32c = builder.crc32c; + this.userProject = builder.userProject; } /** @@ -96,10 +98,23 @@ public String uploadId() { */ @BetaApi @Nullable - public String getCrc32c() { + public String crc32c() { return crc32c; } + /** + * Returns the user-project. + * + * @return the user-project. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public String userProject() { + return userProject; + } + @Override public boolean equals(Object o) { if (this == o) { @@ -113,12 +128,13 @@ public boolean equals(Object o) { && Objects.equals(bucket, that.bucket) && Objects.equals(key, that.key) && Objects.equals(uploadId, that.uploadId) - && Objects.equals(crc32c, that.crc32c); + && Objects.equals(crc32c, that.crc32c) + && Objects.equals(userProject, that.userProject); } @Override public int hashCode() { - return Objects.hash(bucket, key, partNumber, uploadId, crc32c); + return Objects.hash(bucket, key, partNumber, uploadId, crc32c, userProject); } @Override @@ -129,6 +145,7 @@ public String toString() { .add("partNumber", partNumber) .add("uploadId", uploadId) .add("crc32c", crc32c) + .add("userProject", userProject) .toString(); } @@ -155,6 +172,7 @@ public static class Builder { private int partNumber; private String uploadId; @Nullable private String crc32c; + private String userProject; private Builder() {} @@ -223,6 +241,21 @@ public Builder crc32c(@Nullable String crc32c) { return this; } + /** + * Sets the user-project. + * + * @param userProject The user-project. + * @return This builder. + * @see x-goog-user-project + * @since 2.61 This new api is in preview and is subject to breaking changes. + */ + @BetaApi + public Builder userProject(String userProject) { + this.userProject = userProject; + return this; + } + /** * Builds the {@link UploadPartRequest}. * 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 20650a11d0..5f910fb777 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 @@ -461,11 +461,18 @@ public Tuple> list(Map options) { .setPrefix(Option.PREFIX.getString(options)) .setMaxResults(Option.MAX_RESULTS.getLong(options)) .setPageToken(Option.PAGE_TOKEN.getString(options)) + .setReturnPartialSuccess(Option.RETURN_PARTIAL_SUCCESS.getBoolean(options)) .setFields(Option.FIELDS.getString(options)) .setUserProject(Option.USER_PROJECT.getString(options)); setExtraHeaders(list, options); - com.google.api.services.storage.model.Buckets buckets = list.execute(); - return Tuple.>of(buckets.getNextPageToken(), buckets.getItems()); + com.google.api.services.storage.model.Buckets bucketList = list.execute(); + Iterable buckets = + Iterables.concat( + firstNonNull(bucketList.getItems(), ImmutableList.of()), + bucketList.getUnreachable() != null + ? Lists.transform(bucketList.getUnreachable(), createUnreachableBucket()) + : ImmutableList.of()); + return Tuple.>of(bucketList.getNextPageToken(), buckets); } catch (IOException ex) { span.setStatus(Status.UNKNOWN.withDescription(ex.getMessage())); throw translate(ex); @@ -530,6 +537,10 @@ private static String detectContentType(StorageObject object, Map opt return firstNonNull(contentType, "application/octet-stream"); } + private static Function createUnreachableBucket() { + return bucketName -> new Bucket().setName(bucketName).set("isUnreachable", "true"); + } + private static Function objectFromPrefix(final String bucket) { return new Function() { @Override diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/StorageRpc.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/StorageRpc.java index 5127fbf54b..59a56df120 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/StorageRpc.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/spi/v1/StorageRpc.java @@ -58,6 +58,7 @@ enum Option { PROJECTION("projection"), MAX_RESULTS("maxResults"), PAGE_TOKEN("pageToken"), + RETURN_PARTIAL_SUCCESS("returnPartialSuccess"), DELIMITER("delimiter"), START_OFF_SET("startOffset"), END_OFF_SET("endOffset"), diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/BidiUploadTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/BidiUploadTest.java index 7e00427fb4..2774981ecd 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/BidiUploadTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/BidiUploadTest.java @@ -2195,6 +2195,45 @@ public void recordError( assertThat(recordErrorCalled.get()).isTrue(); } + + @Test + public void onResponse_resetsRetryContextToEnsureRetriesArePossibleForLongWrites() { + AtomicBoolean resetCalled = new AtomicBoolean(false); + AtomicBoolean recordErrorCalled = new AtomicBoolean(false); + StreamingResponseObserver obs = + new StreamingResponseObserver( + new BidiUploadState(name.getMethodName()) { + @Override + StorageException onResponse(BidiWriteObjectResponse response) { + return null; + } + }, + new RetryContext() { + @Override + public boolean inBackoff() { + return false; + } + + @Override + public void reset() { + resetCalled.set(true); + } + + @Override + public void recordError( + T t, OnSuccess onSuccess, OnFailure onFailure) { + recordErrorCalled.set(true); + } + }, + RetryContextTest.failOnSuccess(), + RetryContextTest.failOnFailure()); + + obs.onStart(TestUtils.nullStreamController()); + obs.onResponse(resourceWithSize(0)); + + assertThat(resetCalled.get()).isTrue(); + assertThat(recordErrorCalled.get()).isFalse(); + } } static BidiWriteObjectRequest flushOffset(long offset) { diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeHttpServer.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeHttpServer.java index 71bf4a2dac..566a7765eb 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeHttpServer.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/FakeHttpServer.java @@ -93,6 +93,10 @@ public void close() throws Exception { } static FakeHttpServer of(HttpRequestHandler server) { + return of(server, true); + } + + static FakeHttpServer of(HttpRequestHandler server, boolean trailingSlash) { // based on // https://github.com/netty/netty/blob/59aa6e635b9996cf21cd946e64353270679adc73/example/src/main/java/io/netty/example/http/helloworld/HttpHelloWorldServer.java InetSocketAddress address = new InetSocketAddress("localhost", 0); @@ -124,7 +128,8 @@ protected void initChannel(SocketChannel ch) { Channel channel = b.bind(address).syncUninterruptibly().channel(); InetSocketAddress socketAddress = (InetSocketAddress) channel.localAddress(); - URI endpoint = URI.create("http://localhost:" + socketAddress.getPort() + "/"); + String suffix = trailingSlash ? "/" : ""; + URI endpoint = URI.create("http://localhost:" + socketAddress.getPort() + suffix); HttpStorageOptions httpStorageOptions = HttpStorageOptions.http() .setHost(endpoint.toString()) diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITAppendableUploadFakeTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITAppendableUploadFakeTest.java index b6a549aa98..78d07c4d94 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITAppendableUploadFakeTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITAppendableUploadFakeTest.java @@ -921,6 +921,68 @@ public void crc32cWorks() throws Exception { } } + /** + * If a stream is held open for an extended period (i.e. longer than the configured retry timeout) + * and the server returns an error, we want to make sure the currently pending request is able to + * be retried. To accomplish this, the retry context needs to reset it's attempt elapsed timer + * each time a successful response from the server is received. + * + *

This test simulates (using our {@link TestApiClock} the server pausing 60 seconds before + * delivering an ACK. After the ACK, we raise an Unavailable error, the client's retries should be + * able to handle this and pick up where it left off. + */ + @Test + public void + receivingASuccessfulMessageOnTheStreamShouldResetTheElapsedTimerForRetryBudgetCalculation() + throws Exception { + + TestApiClock testClock = TestApiClock.of(0, TestApiClock.addExact(Duration.ofSeconds(1))); + FakeStorage fake = + FakeStorage.of( + ImmutableMap.of( + flush(open_abc), + respond -> respond.onNext(res_abc), + flush(def), + respond -> { + // when receiving the second message, simulate it taking one minute to process + testClock.advance(Duration.ofMinutes(1)); + // then return the incremental response before erroring with a retryable error + respond.onNext(incrementalResponse(6)); + respond.onError(TestUtils.apiException(Status.Code.UNAVAILABLE, "Unavailable")); + }, + reconnect, + respond -> { + BidiWriteObjectResponse.Builder b = res_abc.toBuilder(); + b.getResourceBuilder() + .setSize(6) + .setChecksums( + ObjectChecksums.newBuilder() + .setCrc32C(content.slice(0, 6).getCrc32c()) + .build()); + respond.onNext(b.build()); + }, + flush(ghi), + respond -> respond.onNext(incrementalResponse(9)), + j_finish, + respond -> respond.onNext(resource_10))); + try (FakeServer fakeServer = FakeServer.of(fake); + Storage storage = + fakeServer.getGrpcStorageOptions().toBuilder() + .setClock(testClock) + .build() + .getService()) { + BlobId id = BlobId.of("b", "o"); + + BlobAppendableUpload upload = + storage.blobAppendableUpload(BlobInfo.newBuilder(id).build(), UPLOAD_CONFIG); + try (AppendableUploadWriteableByteChannel channel = upload.open()) { + StorageChannelUtils.blockingEmptyTo(content.asByteBuffer(), channel); + } + ApiFuture result = upload.getResult(); + result.get(5, TimeUnit.SECONDS); + } + } + private static Consumer> maxRetries( @NonNull BidiWriteObjectRequest req, Map<@NonNull BidiWriteObjectRequest, Integer> retryMap, @@ -1020,6 +1082,10 @@ private static BidiWriteObjectRequest finishMessage(long offset) { return BidiWriteObjectRequest.newBuilder().setWriteOffset(offset).setFinishWrite(true).build(); } + private static BidiWriteObjectRequest flush(BidiWriteObjectRequest req) { + return req.toBuilder().setStateLookup(true).setFlush(true).build(); + } + private static void runTestFlushMultipleSegments(FakeStorage fake) throws Exception { try (FakeServer fakeServer = FakeServer.of(fake); GrpcStorageImpl storage = 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 497b82e016..398bb9e51f 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 @@ -16,6 +16,8 @@ package com.google.cloud.storage; +import static com.google.cloud.storage.ByteSizeConstants._1MiB; +import static com.google.cloud.storage.ByteSizeConstants._1MiBL; import static com.google.cloud.storage.ByteSizeConstants._256KiB; import static com.google.cloud.storage.ByteSizeConstants._256KiBL; import static com.google.cloud.storage.ByteSizeConstants._512KiB; @@ -23,7 +25,9 @@ import static com.google.cloud.storage.ByteSizeConstants._768KiBL; import static com.google.common.truth.Truth.assertThat; import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpHeaderNames.CONTENT_RANGE; +import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpHeaderNames.CONTENT_TYPE; import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpHeaderNames.RANGE; +import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus.OK; import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus.SERVICE_UNAVAILABLE; import com.google.api.client.http.javanet.NetHttpTransport; @@ -36,17 +40,25 @@ import com.google.cloud.storage.Retrying.DefaultRetrier; import com.google.cloud.storage.Retrying.RetrierWithAlg; import com.google.cloud.storage.Retrying.RetryingDependencies; +import com.google.cloud.storage.it.ChecksummedTestContent; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import io.grpc.netty.shaded.io.netty.buffer.ByteBuf; +import io.grpc.netty.shaded.io.netty.buffer.Unpooled; import io.grpc.netty.shaded.io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.grpc.netty.shaded.io.netty.handler.codec.http.FullHttpResponse; +import io.grpc.netty.shaded.io.netty.handler.codec.http.HttpHeaderNames; import io.grpc.netty.shaded.io.netty.handler.codec.http.HttpRequest; import io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus; +import java.math.BigInteger; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import org.checkerframework.checker.nullness.qual.Nullable; @@ -266,4 +278,173 @@ public void rewindOfContentIsRelativeToItsBeginOffsetOfTheOverallObject() throws assertThat(actual).isEqualTo(expected); } + + @Test + public void finalChunkContainsCorrectCrc32cHeader() throws Exception { + ChecksummedTestContent ctc = ChecksummedTestContent.gen(_512KiB); + String expectedHashHeader = "crc32c=" + ctc.getCrc32cBase64(); + List chunks = ctc.chunkup(_256KiB); + ChecksummedTestContent chunk1 = chunks.get(0); + ChecksummedTestContent chunk2 = chunks.get(1); + + AtomicReference capturedInitialHash = new AtomicReference<>(); + AtomicReference capturedFinalHash = new AtomicReference<>(); + + HttpRequestHandler handler = + req -> { + String contentRange = req.headers().get(CONTENT_RANGE); + String currentHash = req.headers().get("x-goog-hash"); + + if (contentRange.contains("/*")) { // First chunk (non-final) + capturedInitialHash.set(currentHash); + FullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); + resp.headers() + .set( + HttpHeaderNames.RANGE, + ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); + return resp; + } else { // Second chunk (final) + capturedFinalHash.set(currentHash); + + StorageObject so = + new StorageObject().setName("object").setSize(BigInteger.valueOf(_512KiBL)); + ByteBuf buf = Unpooled.wrappedBuffer(gson.toByteArray(so)); + FullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/json; charset=utf-8"); + return resp; + } + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + String uploadUrl = + fakeHttpServer + .createUri( + "/upload/{uploadId}", ImmutableMap.of("uploadId", UUID.randomUUID().toString())) + .toString(); + + JsonResumableWrite resumableWrite = + JsonResumableWrite.of( + null, ImmutableMap.of(), uploadUrl, 0, Hasher.enabled(), Crc32cValue.zero()); + JsonResumableSession session = + new JsonResumableSession(httpClientContext, RETRIER, resumableWrite); + + ResumableOperationResult<@Nullable StorageObject> put1 = + session.put( + RewindableContent.of(chunk1.asByteBuffer()), + HttpContentRange.of(ByteRangeSpec.explicit(0L, _256KiBL))); + assertThat(put1.getObject()).isNull(); + assertThat(put1.getPersistedSize()).isEqualTo(_256KiBL); + + ResumableOperationResult<@Nullable StorageObject> put2 = + session.put( + RewindableContent.of(chunk2.asByteBuffer()), + HttpContentRange.of(ByteRangeSpec.explicit(0L, _256KiBL), ctc.length())); + assertThat(put2.getObject()).isNotNull(); + assertThat(put2.getPersistedSize()).isEqualTo(_512KiBL); + + assertThat(capturedInitialHash.get()).isNull(); + assertThat(capturedFinalHash.get()).isEqualTo(expectedHashHeader); + } + } + + @Test + public void retriesOfPartiallyConsumedBytesChecksumCorrectly() throws Exception { + ChecksummedTestContent ctc = ChecksummedTestContent.gen(_1MiB); + String expectedFullHashHeader = "crc32c=" + ctc.getCrc32cBase64(); + ChecksummedTestContent chunk1 = ctc.slice(0, _256KiB); + ChecksummedTestContent chunk2 = ctc.slice(_256KiB, _256KiB); + ChecksummedTestContent chunk3 = ctc.slice(_512KiB, _512KiB); + HttpContentRange expectedContentRange1 = + HttpContentRange.of(ByteRangeSpec.explicit(0L, (long) chunk1.length())); + HttpContentRange expectedContentRange2 = + HttpContentRange.of(ByteRangeSpec.explicit(_256KiBL, _256KiBL + chunk2.length())); + HttpContentRange expectedContentrange3 = + HttpContentRange.of(ByteRangeSpec.explicit(_512KiBL, (long) ctc.length()), ctc.length()); + HttpContentRange retriedFullContentRange = + HttpContentRange.of(ByteRangeSpec.explicit(_768KiBL, (long) ctc.length()), ctc.length()); + + AtomicLong requestCount = new AtomicLong(0); + List hashes = Collections.synchronizedList(new ArrayList<>()); + + HttpRequestHandler handler = + req -> { + requestCount.incrementAndGet(); + HttpContentRange contentRange = + HttpContentRange.parse(req.headers().get("Content-Range")); + String hashHeader = req.headers().get("x-goog-hash"); + if (hashHeader != null) { + hashes.add(hashHeader); + } + + if (expectedContentRange1.equals(contentRange)) { + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); + resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _256KiBL).getHttpRangeHeader()); + return resp; + } else if (expectedContentRange2.equals(contentRange)) { + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); + resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _512KiBL).getHttpRangeHeader()); + return resp; + } else if (expectedContentrange3.equals(contentRange)) { + // simulate a broken connection -- except instead of breaking the connection (which is + // very difficult to do with netty) return a 503. + return new DefaultFullHttpResponse( + req.protocolVersion(), HttpResponseStatus.SERVICE_UNAVAILABLE); + } else if (HttpContentRange.query().equals(contentRange)) { + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), RESUME_INCOMPLETE); + resp.headers().set(RANGE, ByteRangeSpec.explicit(0L, _768KiBL).getHttpRangeHeader()); + return resp; + } else if (retriedFullContentRange.equals(contentRange)) { + StorageObject so = + new StorageObject().setName("object").setSize(BigInteger.valueOf(_1MiB)); + ByteBuf buf = Unpooled.wrappedBuffer(gson.toByteArray(so)); + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/json; charset=utf-8"); + return resp; + } + return new DefaultFullHttpResponse( + req.protocolVersion(), HttpResponseStatus.INTERNAL_SERVER_ERROR); + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + String uploadUrl = + fakeHttpServer + .createUri( + "/upload/{uploadId}", ImmutableMap.of("uploadId", UUID.randomUUID().toString())) + .toString(); + + JsonResumableWrite resumableWrite = + JsonResumableWrite.of( + null, ImmutableMap.of(), uploadUrl, 0, Hasher.enabled(), Crc32cValue.zero()); + JsonResumableSession session = + new JsonResumableSession(httpClientContext, RETRIER, resumableWrite); + + ResumableOperationResult<@Nullable StorageObject> result1 = + session.put( + RewindableContent.of(chunk1.asByteBuffer()), + HttpContentRange.of(ByteRangeSpec.explicit(0L, _256KiBL))); + assertThat(result1.getObject()).isNull(); + assertThat(result1.getPersistedSize()).isEqualTo(_256KiBL); + ResumableOperationResult<@Nullable StorageObject> result2 = + session.put( + RewindableContent.of(chunk2.asByteBuffer()), + HttpContentRange.of(ByteRangeSpec.explicit(_256KiBL, _512KiBL))); + assertThat(result2.getObject()).isNull(); + assertThat(result2.getPersistedSize()).isEqualTo(_512KiBL); + ResumableOperationResult<@Nullable StorageObject> result3 = + session.put( + RewindableContent.of(chunk3.asByteBuffer()), + HttpContentRange.of(ByteRangeSpec.explicit(_512KiBL, _1MiBL), ctc.length())); + assertThat(result3.getObject()).isNotNull(); + assertThat(result3.getPersistedSize()).isEqualTo(_1MiBL); + + assertThat(requestCount.get()).isEqualTo(5); + assertThat(hashes) + .isEqualTo(ImmutableList.of(expectedFullHashHeader, expectedFullHashHeader)); + } + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java index 215b8acae6..2c9b75d099 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/ITMultipartUploadHttpRequestManagerTest.java @@ -21,6 +21,12 @@ import static io.grpc.netty.shaded.io.netty.handler.codec.http.HttpResponseStatus.OK; import static org.junit.Assert.assertThrows; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.api.client.http.HttpResponseException; @@ -38,8 +44,11 @@ import com.google.cloud.storage.multipartupload.model.CompletedPart; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadRequest; import com.google.cloud.storage.multipartupload.model.CreateMultipartUploadResponse; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsRequest; +import com.google.cloud.storage.multipartupload.model.ListMultipartUploadsResponse; import com.google.cloud.storage.multipartupload.model.ListPartsRequest; import com.google.cloud.storage.multipartupload.model.ListPartsResponse; +import com.google.cloud.storage.multipartupload.model.MultipartUpload; import com.google.cloud.storage.multipartupload.model.ObjectLockMode; import com.google.cloud.storage.multipartupload.model.Part; import com.google.cloud.storage.multipartupload.model.UploadPartRequest; @@ -72,6 +81,19 @@ public final class ITMultipartUploadHttpRequestManagerTest { static { xmlMapper = new XmlMapper(); xmlMapper.registerModule(new JavaTimeModule()); + xmlMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); + SimpleModule module = new SimpleModule(); + module.addSerializer( + StorageClass.class, + new JsonSerializer() { + @Override + public void serialize( + StorageClass value, JsonGenerator gen, SerializerProvider serializers) + throws java.io.IOException { + gen.writeString(value.toString()); + } + }); + xmlMapper.registerModule(module); } @Rule public final TemporaryFolder temp = new TemporaryFolder(); @@ -559,6 +581,71 @@ public void sendCreateMultipartUploadRequest_withUserProject() throws Exception } } + @Test + public void sendCreateMultipartUploadRequest_withContentType() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.headers().getAll("Content-Type")).containsExactly("audio/mp4"); + + CreateMultipartUploadResponse response = + CreateMultipartUploadResponse.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .build(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + CreateMultipartUploadRequest request = + CreateMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .contentType("audio/mp4") + .build(); + + multipartUploadHttpRequestManager.sendCreateMultipartUploadRequest(request); + } + } + + @Test + public void sendCreateMultipartUploadRequest_sendsContentLength() throws Exception { + HttpRequestHandler handler = + req -> { + // See https://docs.cloud.google.com/storage/docs/xml-api/reference-headers#contentlength + assertThat(req.headers().get("Content-Length")).isEqualTo("0"); + + CreateMultipartUploadResponse response = + CreateMultipartUploadResponse.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .build(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + CreateMultipartUploadRequest request = + CreateMultipartUploadRequest.builder().bucket("test-bucket").key("test-key").build(); + + multipartUploadHttpRequestManager.sendCreateMultipartUploadRequest(request); + } + } + @Test public void sendListPartsRequest_success() throws Exception { HttpRequestHandler handler = @@ -566,14 +653,14 @@ public void sendListPartsRequest_success() throws Exception { OffsetDateTime lastModified = OffsetDateTime.of(2024, 5, 8, 17, 50, 0, 0, ZoneOffset.UTC); ListPartsResponse listPartsResponse = ListPartsResponse.builder() - .setBucket("test-bucket") - .setKey("test-key") - .setUploadId("test-upload-id") - .setPartNumberMarker(0) - .setNextPartNumberMarker(1) - .setMaxParts(1) - .setIsTruncated(false) - .setParts( + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .partNumberMarker(0) + .nextPartNumberMarker(1) + .maxParts(1) + .truncated(false) + .parts( Collections.singletonList( Part.builder() .partNumber(1) @@ -605,15 +692,15 @@ public void sendListPartsRequest_success() throws Exception { ListPartsResponse response = multipartUploadHttpRequestManager.sendListPartsRequest(request); assertThat(response).isNotNull(); - assertThat(response.getBucket()).isEqualTo("test-bucket"); - assertThat(response.getKey()).isEqualTo("test-key"); - assertThat(response.getUploadId()).isEqualTo("test-upload-id"); - assertThat(response.getPartNumberMarker()).isEqualTo(0); - assertThat(response.getNextPartNumberMarker()).isEqualTo(1); - assertThat(response.getMaxParts()).isEqualTo(1); - assertThat(response.isTruncated()).isFalse(); - assertThat(response.getParts()).hasSize(1); - Part part = response.getParts().get(0); + assertThat(response.bucket()).isEqualTo("test-bucket"); + assertThat(response.key()).isEqualTo("test-key"); + assertThat(response.uploadId()).isEqualTo("test-upload-id"); + assertThat(response.partNumberMarker()).isEqualTo(0); + assertThat(response.nextPartNumberMarker()).isEqualTo(1); + assertThat(response.maxParts()).isEqualTo(1); + assertThat(response.truncated()).isFalse(); + assertThat(response.parts()).hasSize(1); + Part part = response.parts().get(0); assertThat(part.partNumber()).isEqualTo(1); assertThat(part.eTag()).isEqualTo("\"etag\""); assertThat(part.size()).isEqualTo(123); @@ -723,6 +810,45 @@ public void sendListPartsRequest_errorResponse() throws Exception { } } + @Test + public void sendListPartsRequest_withUserProject() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); + ListPartsResponse listPartsResponse = + ListPartsResponse.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .maxParts(1) + .partNumberMarker(0) + .parts(ImmutableList.of()) + .build(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(listPartsResponse)); + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + ListPartsRequest request = + ListPartsRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .userProject("test-project") + .build(); + + ListPartsResponse response = multipartUploadHttpRequestManager.sendListPartsRequest(request); + + assertThat(response).isNotNull(); + assertThat(response.bucket()).isEqualTo("test-bucket"); + } + } + @Test public void sendAbortMultipartUploadRequest_success() throws Exception { HttpRequestHandler handler = @@ -780,6 +906,37 @@ public void sendAbortMultipartUploadRequest_error() throws Exception { } } + @Test + public void sendAbortMultipartUploadRequest_withUserProject() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); + AbortMultipartUploadResponse response = new AbortMultipartUploadResponse(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + AbortMultipartUploadRequest request = + AbortMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .userProject("test-project") + .build(); + + AbortMultipartUploadResponse response = + multipartUploadHttpRequestManager.sendAbortMultipartUploadRequest(request); + + assertThat(response).isNotNull(); + } + } + @Test public void sendCompleteMultipartUploadRequest_success() throws Exception { HttpRequestHandler handler = @@ -903,6 +1060,53 @@ public void sendCompleteMultipartUploadRequest_body() throws Exception { } } + @Test + public void sendCompleteMultipartUploadRequest_withUserProject() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); + CompleteMultipartUploadResponse response = + CompleteMultipartUploadResponse.builder() + .bucket("test-bucket") + .key("test-key") + .etag("\"test-etag\"") + .build(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + CompleteMultipartUploadRequest request = + CompleteMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .userProject("test-project") + .multipartUpload( + CompletedMultipartUpload.builder() + .parts( + ImmutableList.of( + CompletedPart.builder().partNumber(1).eTag("\"etag1\"").build(), + CompletedPart.builder().partNumber(2).eTag("\"etag2\"").build())) + .build()) + .build(); + + CompleteMultipartUploadResponse response = + multipartUploadHttpRequestManager.sendCompleteMultipartUploadRequest(request); + + assertThat(response).isNotNull(); + assertThat(response.bucket()).isEqualTo("test-bucket"); + assertThat(response.key()).isEqualTo("test-key"); + assertThat(response.etag()).isEqualTo("\"test-etag\""); + } + } + @Test public void sendUploadPartRequest_success() throws Exception { String etag = "\"af1ed31420542285653c803a34aa839a\""; @@ -1025,6 +1229,40 @@ public void sendUploadPartRequest_withCustomChecksum() throws Exception { } } + @Test + public void sendUploadPartRequest_withUserProject() throws Exception { + String etag = "\"af1ed31420542285653c803a34aa839a\""; + byte[] contentBytes = "hello world".getBytes(StandardCharsets.UTF_8); + + HttpRequestHandler handler = + req -> { + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); + DefaultFullHttpResponse resp = new DefaultFullHttpResponse(req.protocolVersion(), OK); + resp.headers().set("ETag", etag); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + UploadPartRequest request = + UploadPartRequest.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .partNumber(1) + .userProject("test-project") + .build(); + + UploadPartResponse response = + multipartUploadHttpRequestManager.sendUploadPartRequest( + request, RewindableContent.of(ByteBuffer.wrap(contentBytes))); + + assertThat(response).isNotNull(); + assertThat(response.eTag()).isEqualTo(etag); + } + } + @Test public void sendUploadPartRequest_error() throws Exception { HttpRequestHandler handler = @@ -1053,4 +1291,187 @@ public void sendUploadPartRequest_error() throws Exception { request, RewindableContent.empty())); } } + + @Test + public void sendListMultipartUploadsRequest_success() throws Exception { + HttpRequestHandler handler = + req -> { + ListMultipartUploadsResponse listMultipartUploadsResponse = + ListMultipartUploadsResponse.builder() + .bucket("test-bucket") + .keyMarker("key-marker") + .uploadIdMarker("upload-id-marker") + .nextKeyMarker("next-key-marker") + .nextUploadIdMarker("next-upload-id-marker") + .maxUploads(1) + .truncated(false) + .uploads( + ImmutableList.of( + MultipartUpload.newBuilder() + .key("test-key") + .uploadId("test-upload-id") + .storageClass(StorageClass.STANDARD) + .initiated( + OffsetDateTime.of(2025, 11, 11, 0, 0, 0, 0, ZoneOffset.UTC)) + .build())) + .build(); + // Jackson fails to serialize ImmutableList without GuavaModule. + // We use reflection to replace it with ArrayList for the test. + forceSetUploads(listMultipartUploadsResponse, listMultipartUploadsResponse.uploads()); + + ByteBuf buf = + Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(listMultipartUploadsResponse)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + + resp.headers().set("Content-Type", "application/xml; charset=utf-8"); + resp.headers().set("Content-Length", resp.content().readableBytes()); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + + ListMultipartUploadsRequest request = + ListMultipartUploadsRequest.builder() + .bucket("test-bucket") + .maxUploads(1) + .keyMarker("key-marker") + .uploadIdMarker("upload-id-marker") + .build(); + + ListMultipartUploadsResponse response = + multipartUploadHttpRequestManager.sendListMultipartUploadsRequest(request); + + assertThat(response).isNotNull(); + assertThat(response.bucket()).isEqualTo("test-bucket"); + assertThat(response.uploads()).hasSize(1); + + MultipartUpload upload = response.uploads().get(0); + assertThat(upload.key()).isEqualTo("test-key"); + assertThat(upload.storageClass()).isEqualTo(StorageClass.STANDARD); + assertThat(upload.initiated()) + .isEqualTo(OffsetDateTime.of(2025, 11, 11, 0, 0, 0, 0, ZoneOffset.UTC)); + } + } + + @Test + public void sendListMultipartUploadsRequest_error() throws Exception { + HttpRequestHandler handler = + req -> { + FullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), HttpResponseStatus.BAD_REQUEST); + resp.headers().set(CONTENT_TYPE, "text/plain; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + ListMultipartUploadsRequest request = + ListMultipartUploadsRequest.builder().bucket("test-bucket").build(); + + assertThrows( + HttpResponseException.class, + () -> multipartUploadHttpRequestManager.sendListMultipartUploadsRequest(request)); + } + } + + @Test + public void sendListMultipartUploadsRequest_withUserProject() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.headers().get("x-goog-user-project")).isEqualTo("test-project"); + ListMultipartUploadsResponse listMultipartUploadsResponse = + ListMultipartUploadsResponse.builder() + .bucket("test-bucket") + .keyMarker("key-marker") + .uploadIdMarker("upload-id-marker") + .nextKeyMarker("next-key-marker") + .nextUploadIdMarker("next-upload-id-marker") + .maxUploads(1) + .truncated(false) + .uploads(ImmutableList.of()) + .build(); + // Jackson fails to serialize ImmutableList without GuavaModule. + // We use reflection to replace it with ArrayList for the test. + forceSetUploads(listMultipartUploadsResponse, listMultipartUploadsResponse.uploads()); + + ByteBuf buf = + Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(listMultipartUploadsResponse)); + + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + + resp.headers().set("Content-Type", "application/xml; charset=utf-8"); + resp.headers().set("Content-Length", resp.content().readableBytes()); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler)) { + MultipartUploadHttpRequestManager multipartUploadHttpRequestManager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + + ListMultipartUploadsRequest request = + ListMultipartUploadsRequest.builder() + .bucket("test-bucket") + .maxUploads(1) + .userProject("test-project") + .build(); + + ListMultipartUploadsResponse response = + multipartUploadHttpRequestManager.sendListMultipartUploadsRequest(request); + + assertThat(response).isNotNull(); + assertThat(response.bucket()).isEqualTo("test-bucket"); + } + } + + @Test + public void hostWithoutTrailingSlash_urlConstructedCorrectly() throws Exception { + HttpRequestHandler handler = + req -> { + assertThat(req.uri()).startsWith("/test-bucket/test-key"); + CreateMultipartUploadResponse response = + CreateMultipartUploadResponse.builder() + .bucket("test-bucket") + .key("test-key") + .uploadId("test-upload-id") + .build(); + ByteBuf buf = Unpooled.wrappedBuffer(xmlMapper.writeValueAsBytes(response)); + DefaultFullHttpResponse resp = + new DefaultFullHttpResponse(req.protocolVersion(), OK, buf); + resp.headers().set(CONTENT_TYPE, "application/xml; charset=utf-8"); + return resp; + }; + + try (FakeHttpServer fakeHttpServer = FakeHttpServer.of(handler, false)) { + MultipartUploadHttpRequestManager manager = + MultipartUploadHttpRequestManager.createFrom(fakeHttpServer.getHttpStorageOptions()); + CreateMultipartUploadRequest request = + CreateMultipartUploadRequest.builder() + .bucket("test-bucket") + .key("test-key") + .contentType("application/octet-stream") + .build(); + + CreateMultipartUploadResponse response = manager.sendCreateMultipartUploadRequest(request); + + assertThat(response.bucket()).isEqualTo("test-bucket"); + } + } + + private void forceSetUploads( + ListMultipartUploadsResponse response, java.util.List uploads) { + try { + java.lang.reflect.Field uploadsField = + ListMultipartUploadsResponse.class.getDeclaredField("uploads"); + uploadsField.setAccessible(true); + uploadsField.set(response, new java.util.ArrayList<>(uploads)); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/SerializationTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/SerializationTest.java index 1514c0f982..8905a48c90 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/SerializationTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/SerializationTest.java @@ -266,7 +266,9 @@ protected Restorable[] restorableObjects() { Conversions.json().blobInfo().encode(BlobInfo.newBuilder("b", "n").build()), ImmutableMap.of(), "upload-id", - 0)); + 0, + Hasher.enabled(), + Crc32cValue.zero())); return new Restorable[] {readerV2, writer}; } diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java index bae4295976..ec9dfe9e74 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplMockitoTest.java @@ -200,6 +200,8 @@ public class StorageImplMockitoTest { Storage.BucketListOption.fields(); private static final Map BUCKET_LIST_OPTIONS = ImmutableMap.of(StorageRpc.Option.MAX_RESULTS, PAGE_SIZE, StorageRpc.Option.PREFIX, "prefix"); + private static final Map BUCKET_LIST_PARTIAL_SUCCESS_OPTION = + ImmutableMap.of(StorageRpc.Option.RETURN_PARTIAL_SUCCESS, true); // Blob list options private static final Storage.BlobListOption BLOB_LIST_PAGE_SIZE = diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/XmlObjectParserTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/XmlObjectParserTest.java index c2c146b5fd..f3619e77be 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/XmlObjectParserTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/XmlObjectParserTest.java @@ -89,7 +89,7 @@ public void testNestedParseStringValueEnum_undefined() throws IOException { + ""; ListPartsResponse listPartsResponse = xmlObjectParser.parseAndClose(new StringReader(xml), ListPartsResponse.class); - assertThat(listPartsResponse.getStorageClass()).isNull(); + assertThat(listPartsResponse.storageClass()).isNull(); } @Test @@ -115,7 +115,7 @@ public void testNestedParseStringValueEnum_null() throws IOException { + ""; ListPartsResponse listPartsResponse = xmlObjectParser.parseAndClose(new StringReader(xml), ListPartsResponse.class); - assertThat(listPartsResponse.getStorageClass()).isNull(); + assertThat(listPartsResponse.storageClass()).isNull(); } @Test @@ -141,7 +141,7 @@ public void testNestedParseStringValueEnum_nonNull() throws IOException { + ""; ListPartsResponse listPartsResponse = xmlObjectParser.parseAndClose(new StringReader(xml), ListPartsResponse.class); - assertThat(listPartsResponse.getStorageClass()).isEqualTo(StorageClass.STANDARD); + assertThat(listPartsResponse.storageClass()).isEqualTo(StorageClass.STANDARD); } private static class TestXmlObject {} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITListBucketTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITListBucketTest.java new file mode 100644 index 0000000000..f539e01cc2 --- /dev/null +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITListBucketTest.java @@ -0,0 +1,102 @@ +/* + * Copyright 2025 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.common.truth.Truth.assertThat; + +import com.google.api.gax.paging.Page; +import com.google.cloud.storage.Bucket; +import com.google.cloud.storage.BucketInfo; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.Storage.BucketListOption; +import com.google.cloud.storage.TransportCompatibility.Transport; +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.BucketFixture; +import com.google.cloud.storage.it.runner.annotations.BucketType; +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 com.google.common.collect.ImmutableMap; +import java.util.Map; +import java.util.stream.Collectors; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(StorageITRunner.class) +@CrossRun( + backends = {Backend.TEST_BENCH}, + transports = {Transport.HTTP, Transport.GRPC}) +public class ITListBucketTest { + @Inject public Storage storage; + + @Inject public BucketInfo defaultBucket; + + @Inject public Generator generator; + + @Inject + @BucketFixture(BucketType.HNS) + public BucketInfo hnsBucket; + + private static final String UNREACHABLE_BUCKET_SUFFIX = ".unreachable"; + + @Test + public void testListBucketWithPartialSuccess() throws Exception { + doTest(Reachability.Unreachable, BucketListOption.returnPartialSuccess(true)); + } + + @Test + public void testListBucketWithoutPartialSuccess() throws Exception { + doTest(Reachability.Reachable); + } + + private void doTest( + Reachability expectedReachabilityOfUnreachableBucket, BucketListOption... bucketListOption) + throws Exception { + // TESTBENCH considers a bucket to be unreachable if the bucket name contains "unreachable" + String name = generator.randomBucketName() + UNREACHABLE_BUCKET_SUFFIX; + BucketInfo info = BucketInfo.of(name); + try (TemporaryBucket tmpBucket = + TemporaryBucket.newBuilder().setBucketInfo(info).setStorage(storage).build()) { + Map expected = + ImmutableMap.of( + defaultBucket.getName(), Reachability.Reachable, + hnsBucket.getName(), Reachability.Reachable, + tmpBucket.getBucket().getName(), expectedReachabilityOfUnreachableBucket); + + Page page = storage.list(bucketListOption); + + Map actual = + page.streamAll().collect(Collectors.toMap(BucketInfo::getName, Reachability::forBucket)); + + assertThat(actual).containsAtLeastEntriesIn(expected); + } + } + + private enum Reachability { + Reachable, + Unreachable; + + static Reachability forBucket(BucketInfo b) { + if (b.isUnreachable() != null && b.isUnreachable()) { + return Unreachable; + } else { + return Reachable; + } + } + } +} diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITMultipartUploadClientTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITMultipartUploadClientTest.java index 4394137570..1b60312750 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITMultipartUploadClientTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITMultipartUploadClientTest.java @@ -322,7 +322,7 @@ private void doTest(int objectSizeBytes) throws IOException { ListPartsRequest.Builder listPartsBuilder = ListPartsRequest.builder().bucket(info.getBucket()).key(info.getName()).uploadId(uploadId); ListPartsResponse listPartsResponse = multipartUploadClient.listParts(listPartsBuilder.build()); - assertThat(listPartsResponse.getParts()).hasSize(completedParts.size()); + assertThat(listPartsResponse.parts()).hasSize(completedParts.size()); completeMultipartUpload(info, uploadId, completedParts); diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml index 4c9ad3d268..8879ebc37d 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.60.1-SNAPSHOT + 2.62.0 grpc-google-cloud-storage-control-v2 GRPC library for google-cloud-storage com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.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 ca0f2beb42..453bd23c6c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml index 0a99cea3bc..dc10ea531a 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.60.1-SNAPSHOT + 2.62.0 grpc-google-cloud-storage-v2 GRPC library for grpc-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.0 diff --git a/grpc-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageGrpc.java b/grpc-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageGrpc.java index bdccd24c96..90065e3c1c 100644 --- a/grpc-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageGrpc.java +++ b/grpc-google-cloud-storage-v2/src/main/java/com/google/storage/v2/StorageGrpc.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/pom.xml b/pom.xml index 11e328f18d..863be21d20 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.google.cloud google-cloud-storage-parent pom - 2.60.1-SNAPSHOT + 2.62.0 Storage Parent https://github.com/googleapis/java-storage @@ -14,7 +14,7 @@ com.google.cloud sdk-platform-java-config - 3.54.1 + 3.55.1 @@ -82,17 +82,17 @@ com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 com.google.apis google-api-services-storage - v1-rev20250925-2.0.0 + v1-rev20251118-2.0.0 com.google.cloud google-cloud-pubsub - 1.143.0 + 1.143.1 test @@ -104,32 +104,32 @@ com.google.api.grpc proto-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc grpc-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc gapic-google-cloud-storage-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc grpc-google-cloud-storage-control-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.api.grpc proto-google-cloud-storage-control-v2 - 2.60.1-SNAPSHOT + 2.62.0 com.google.cloud google-cloud-storage-control - 2.60.1-SNAPSHOT + 2.62.0 com.google.cloud diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml index 8727018370..8aa1eaf8e4 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.60.1-SNAPSHOT + 2.62.0 proto-google-cloud-storage-control-v2 Proto library for proto-google-cloud-storage-control-v2 com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.0 diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCache.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCache.java index 61411dcddc..c53ce4eca8 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCache.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCache.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheName.java index bdab5966fc..f56f029187 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheName.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheOrBuilder.java index ff73fa3689..cbd0cf5010 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/AnywhereCacheOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/BucketName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/BucketName.java index bcee6ee108..17822379ad 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/BucketName.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/BucketName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b0cb2f666f..5e23ec72e3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a16895ee35..5c4344eddb 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadata.java index b668bf89be..2a043bd79e 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadataOrBuilder.java index 5ff8421c05..0a618f0904 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheMetadataOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequest.java index b414a2234a..21c742c1bc 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequestOrBuilder.java index 3729eddde3..2dc66387fd 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/CreateAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 1bd6c4828c..5461e2a46a 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 94f0fbc7a5..b1cc717cc0 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 69318b863a..56f0119c1d 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index ca91e6120c..e2ff41e392 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 eadba5ea3e..c9741240e6 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 065ef970c3..1c94801599 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 315c0c879d..5f6366dad9 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 9039f9559d..632fd1e341 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequest.java index a1dec6dbdb..424966ece0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequestOrBuilder.java index e014a589d0..47304a8691 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/DisableAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2546e65ec8..92f6f0ed02 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderName.java index e1ed5bb7f5..239b5fe061 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderName.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/FolderName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 3434ce57c1..211229ad80 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequest.java index 0dda307bf2..133992e941 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequestOrBuilder.java index d5d3906743..742c6ab941 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequest.java index 9a3ece21ae..f0013ada83 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequestOrBuilder.java index 117fc72dfa..8c25483ec4 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetFolderIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a33bc92959..cdaeb71ed1 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 133b5b4f71..5bc078beb7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index e0db01c9b6..8641cb204f 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index e3c7395288..13e2c6e2d1 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequest.java index f171387ad8..6e547211df 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequestOrBuilder.java index 9a88fc8009..cb00d4a2e0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetOrganizationIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequest.java index 633ced0b2f..0ca4382dc0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequestOrBuilder.java index c40bd7e22d..8e57ebe4f3 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/GetProjectIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 8de4177997..a6710da06e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 6b13acf84c..e6f2f75272 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfig.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfig.java index e823d5c938..fad787393f 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfig.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigName.java index 98412887ad..24c1cef52d 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigName.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigOrBuilder.java index 3d64049edf..b502ff1a3e 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/IntelligenceConfigOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequest.java index 74339ed7ca..eda7b8362d 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequestOrBuilder.java index 946d253264..6b33bb77a4 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponse.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponse.java index a91326d08c..23a074492b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponse.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponseOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponseOrBuilder.java index 7d26e9cd23..e9a9fb68aa 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponseOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ListAnywhereCachesResponseOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 bfa3c6e305..b28ac6d6c0 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 6bdd365fb6..5730103dab 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 e1aacc6ffb..4f1c91e834 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b137d21a9f..3acdcf7836 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 79cef79343..cff9354c65 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 880bf43147..761d47034d 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 3c9f9b7cab..f80784650a 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index 497b27d3c7..8faf74c122 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index c0823571e2..9b88bb560c 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index a421b79350..f577880909 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 index b2cf00a42c..a02156466d 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequest.java index a55539ff37..b43447aded 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequestOrBuilder.java index e467754196..a208b46380 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/PauseAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 ed5b8a1046..4dde0823e7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 7e89ced3c1..2b380696b1 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 0d7a124bd2..0b1a81d9c6 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 6b79b9dd6e..a7f2e703b4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 e7371daf87..f103f3d503 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 e20d1081b7..4d7357ae61 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequest.java index dfed8fced0..b7a413ce52 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequestOrBuilder.java index dbb3900469..32d7ced5b5 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/ResumeAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 483b2e529a..cef60d9b27 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a43be3a84b..ad94cbc989 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutName.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutName.java index 471eb8fb06..5039f7ad4d 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutName.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/StorageLayoutName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 55326507d7..8865f3de5e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadata.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadata.java index 3dd479d34a..57b6558dbb 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadata.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadataOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadataOrBuilder.java index fb7533dd97..f5998f1143 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadataOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheMetadataOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequest.java index 6d641ab164..b63d37cbb3 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequestOrBuilder.java index 8f3c6e7e20..54aaaea0a3 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateAnywhereCacheRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequest.java index ebb250e970..d55222386b 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequestOrBuilder.java index 9dc9c40c49..ac678ec4e0 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateFolderIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequest.java index 0b97c3c3a9..c541000455 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequestOrBuilder.java index fc992c342c..566fd8a251 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateOrganizationIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequest.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequest.java index df079530e8..0ed77522f7 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequest.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequestOrBuilder.java b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequestOrBuilder.java index 8a43070e07..7d3fd47c36 100644 --- a/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequestOrBuilder.java +++ b/proto-google-cloud-storage-control-v2/src/main/java/com/google/storage/control/v2/UpdateProjectIntelligenceConfigRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml index f05f4253b9..2c2b1612ef 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.60.1-SNAPSHOT + 2.62.0 proto-google-cloud-storage-v2 PROTO library for proto-google-cloud-storage-v2 com.google.cloud google-cloud-storage-parent - 2.60.1-SNAPSHOT + 2.62.0 diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpec.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpec.java index 7cedc36da2..8586a99597 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpec.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpecOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpecOrBuilder.java index 489924de7e..90d65b2dca 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpecOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/AppendObjectSpecOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandle.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandle.java index 90c60b537d..be0e2b206f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandle.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandle.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandleOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandleOrBuilder.java index 0e6f134151..cf07526f34 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandleOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadHandleOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectError.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectError.java index 85553fd4a6..2c26c869c2 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectError.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectError.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectErrorOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectErrorOrBuilder.java index d498aa9c60..d6ba3c5a09 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectErrorOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectErrorOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedError.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedError.java index 423c663e52..3bf0edbb6c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedError.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedError.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedErrorOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedErrorOrBuilder.java index 473c6030a4..be0accdf23 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedErrorOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRedirectedErrorOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequest.java index 12da44f004..6b1c2f6fc1 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequestOrBuilder.java index 511010dff7..b7bb9f66d7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponse.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponse.java index 95c96e91f3..f462a1a1b7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponse.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponseOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponseOrBuilder.java index baa53920bf..971b5ea3cf 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponseOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectResponseOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpec.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpec.java index 63ba0c2c82..40da246d54 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpec.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpec.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpecOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpecOrBuilder.java index 56673655f0..8a4fdd2e94 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpecOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiReadObjectSpecOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandle.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandle.java index e86ed2a824..cb4128cc0e 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandle.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandle.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandleOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandleOrBuilder.java index e5f3de5367..6012582d2c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandleOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteHandleOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedError.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedError.java index 9932c5982f..3c06cb45c3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedError.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedError.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedErrorOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedErrorOrBuilder.java index beaef65e1e..be8a16bdb8 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedErrorOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BidiWriteObjectRedirectedErrorOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 18c12adff4..ff2138c52c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4224583eb9..cfcc1b0838 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 20f5aac8e4..0335c52938 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 8976401bad..e6e08feb2c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 207c401c04..8d03d884ee 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 78ba0b195e..0708d75574 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 43c897e583..27c66892cc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketName.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketName.java index 21fab29aec..67619b665f 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketName.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/BucketName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a3b2d5d013..adb0729b60 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 87068a617c..9350c742d2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b4e2512656..c6d45217af 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 46fcde480b..ba05ec01f3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 9b45fdf0fb..f6fbb6133e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 117d9bb282..4a93a1f5cc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 8ed601a66c..9013af0754 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b48bb51c98..057251250a 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4119c7784e..543373a696 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 0994d8309c..51cf4128d4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 5eabc026c4..22eb1780da 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 654ca0e23f..9dbc3256f4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4861f53a5a..c7d1e9effa 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 256de39c83..751dbb5efb 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 7c646f2191..cb40a4f6d7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CryptoKeyName.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CryptoKeyName.java index 1279232462..f10da50fb9 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CryptoKeyName.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/CryptoKeyName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 44e4d733ad..a2b8240bbd 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2bd6387646..70d857f111 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 65ba3e8487..62db8749ad 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 73e36136e4..b263ed0277 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2089b35aef..f1e1fc61e4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 5b7eb15d51..fb1f0ba672 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 86004338eb..ea8aca51d2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 fed5323d2a..334a650143 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 d63a19fbf8..e7b5080c7f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 f6255e4913..f2e714511e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 8ecb77cdf5..9f1681806f 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 e6e530df58..03eddc3ff9 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 f347139e4e..bc179046bc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 eed2d224d7..b40777eae2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a01df7f8f2..4633bd0945 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 09aefff184..b33029fbe7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a23f7f8c04..77f9d17706 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 de27437135..10da502611 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 c208a63ed4..b0a4b752ed 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 bd77bd7de9..ae2c2ebab0 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequest.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequest.java index 3db3ee0b5b..d33ff8efb3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequest.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequest.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequestOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequestOrBuilder.java index 53fd3ff8d3..950f246eeb 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequestOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/MoveObjectRequestOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 1202cbf6e1..155fb56acc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a01cfa93d2..f40c114a0c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 bc893f63c4..9391604426 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4a49f72e38..5426593a6c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 df677480d5..3594cbeba2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContexts.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContexts.java index bfa57fdc5c..0a9568bba6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContexts.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContexts.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContextsOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContextsOrBuilder.java index db6a67b6a3..1e69dce7f3 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContextsOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectContextsOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayload.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayload.java index a76cea2966..97c75b7b8d 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayload.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayload.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayloadOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayloadOrBuilder.java index e973d9a0b6..618df67ed7 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayloadOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectCustomContextPayloadOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 cdf0880618..50fcfb2047 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeData.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeData.java index e1c937f1ff..7965aeca02 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeData.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeData.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeDataOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeDataOrBuilder.java index d36df6ba98..79eb87e32c 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeDataOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ObjectRangeDataOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 ecbf3f86c4..dfca88c342 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 d0fb9675de..83533324f4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectName.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectName.java index 4e28041852..813ee08794 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectName.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ProjectName.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2c68d00aaa..533601a0d7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 6627b82512..f4dd1ec1ad 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a26e62dfbb..fe783bb72c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 d90f5738e2..a7d73b5852 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 53c8ab8774..50a6320227 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 5f59fec54a..e48df5c253 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 1a3db73f7c..0dd1c19d6c 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2c703e5659..b016c9dd35 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 9b2742318b..f9ca95e3db 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 2756d85676..4b3cbcb747 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRange.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRange.java index f8d909bf20..def328dbc6 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRange.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRange.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeError.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeError.java index aade2aaf52..b4ab632321 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeError.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeError.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeErrorOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeErrorOrBuilder.java index 6f5adb6cc9..4d6fdda3a0 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeErrorOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeErrorOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeOrBuilder.java b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeOrBuilder.java index d005aa9ec1..49810239e4 100644 --- a/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeOrBuilder.java +++ b/proto-google-cloud-storage-v2/src/main/java/com/google/storage/v2/ReadRangeOrBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4d769d6cae..67ca0a8b7e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 63f0e5e515..2b40677db3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 c444ea33c5..e1637250fc 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 159a8db66d..95bb615bf5 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 ed0ea5fb6f..8f82854e4e 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 05314ceb9b..bfab1876e4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 a5513bdb7d..8f9f1681e7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 b60d0caa05..d3f38292cb 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 e897c28d93..48eecf5457 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 6d04895c4c..dbbc3f2666 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 0e26c2ac5a..08e8ef94ad 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 956c2d4a0c..4c9e5ff9f8 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 382d615118..5d7454adac 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 178cae0c44..b183dd18ba 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 93fd23008f..d3a0deb56a 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 4d13e6ade9..1606fd8461 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 ef65cfc7a3..5e1ac688b7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 d0309716cf..b325aeeef3 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 0446b25e5c..de37734add 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 31143cc8f3..22941a6e4a 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 de65c68f81..4d53574098 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 1bbf0baa85..9f5b95b3e4 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. 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 3cdb5ee71a..6697156881 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 @@ -1,5 +1,5 @@ /* - * Copyright 2025 Google LLC + * Copyright 2026 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/samples/install-without-bom/pom.xml b/samples/install-without-bom/pom.xml index 33b6da2011..833e8dc9ce 100644 --- a/samples/install-without-bom/pom.xml +++ b/samples/install-without-bom/pom.xml @@ -30,12 +30,12 @@ com.google.cloud google-cloud-storage - 2.60.0 + 2.61.0 com.google.cloud google-cloud-storage-control - 2.60.0 + 2.61.0 @@ -66,19 +66,19 @@ com.google.cloud google-cloud-pubsub - 1.143.0 + 1.143.1 test com.google.cloud google-cloud-kms - 2.81.0 + 2.83.0 test com.google.cloud google-cloud-storage - 2.60.0 + 2.61.0 tests test diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml index bc204e262e..da48b2419c 100644 --- a/samples/snapshot/pom.xml +++ b/samples/snapshot/pom.xml @@ -28,12 +28,12 @@ com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 com.google.cloud google-cloud-storage-control - 2.60.1-SNAPSHOT + 2.62.0 compile @@ -58,19 +58,19 @@ com.google.cloud google-cloud-pubsub - 1.143.0 + 1.143.1 test com.google.cloud google-cloud-kms - 2.81.0 + 2.83.0 test com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 tests test diff --git a/samples/snippets/pom.xml b/samples/snippets/pom.xml index 4305b1fe9b..d4cd09ca82 100644 --- a/samples/snippets/pom.xml +++ b/samples/snippets/pom.xml @@ -31,7 +31,7 @@ com.google.cloud libraries-bom - 26.71.0 + 26.73.0 pom import @@ -76,13 +76,13 @@ com.google.cloud google-cloud-pubsub - 1.143.0 + 1.143.1 test com.google.cloud google-cloud-kms - 2.81.0 + 2.83.0 test @@ -99,7 +99,7 @@ com.google.cloud google-cloud-storage - 2.60.0 + 2.61.0 tests test diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml index 96f3a165bc..0752fb4517 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.60.1-SNAPSHOT + 2.62.0 @@ -31,7 +31,7 @@ com.google.cloud google-cloud-storage - 2.60.1-SNAPSHOT + 2.62.0 tests diff --git a/versions.txt b/versions.txt index f1084624ee..01c8f59066 100644 --- a/versions.txt +++ b/versions.txt @@ -1,10 +1,10 @@ # Format: # module:released-version:current-version -google-cloud-storage:2.60.0:2.60.1-SNAPSHOT -gapic-google-cloud-storage-v2:2.60.0:2.60.1-SNAPSHOT -grpc-google-cloud-storage-v2:2.60.0:2.60.1-SNAPSHOT -proto-google-cloud-storage-v2:2.60.0:2.60.1-SNAPSHOT -google-cloud-storage-control:2.60.0:2.60.1-SNAPSHOT -proto-google-cloud-storage-control-v2:2.60.0:2.60.1-SNAPSHOT -grpc-google-cloud-storage-control-v2:2.60.0:2.60.1-SNAPSHOT +google-cloud-storage:2.62.0:2.62.0 +gapic-google-cloud-storage-v2:2.62.0:2.62.0 +grpc-google-cloud-storage-v2:2.62.0:2.62.0 +proto-google-cloud-storage-v2:2.62.0:2.62.0 +google-cloud-storage-control:2.62.0:2.62.0 +proto-google-cloud-storage-control-v2:2.62.0:2.62.0 +grpc-google-cloud-storage-control-v2:2.62.0:2.62.0