diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0427c3e876a5..e50686c059fa 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -59,7 +59,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - name: Get current week within the year id: date @@ -226,7 +226,7 @@ jobs: fail-fast: false matrix: package: ${{ fromJSON(needs.changes.outputs.packages) }} - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - name: Get current week within the year id: date diff --git a/.github/workflows/google-auth-library-java-ci.yaml b/.github/workflows/google-auth-library-java-ci.yaml index 21373cd62925..e12979f75787 100644 --- a/.github/workflows/google-auth-library-java-ci.yaml +++ b/.github/workflows/google-auth-library-java-ci.yaml @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-bigquery-jdbc-ci.yaml b/.github/workflows/java-bigquery-jdbc-ci.yaml index 2883253a7529..a2d49580d537 100644 --- a/.github/workflows/java-bigquery-jdbc-ci.yaml +++ b/.github/workflows/java-bigquery-jdbc-ci.yaml @@ -49,7 +49,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-bigtable-ci.yaml b/.github/workflows/java-bigtable-ci.yaml index c0328b1435ce..b935cf9eed1b 100644 --- a/.github/workflows/java-bigtable-ci.yaml +++ b/.github/workflows/java-bigtable-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-firestore-ci.yaml b/.github/workflows/java-firestore-ci.yaml index 3118df474f58..f4fac240ee4e 100644 --- a/.github/workflows/java-firestore-ci.yaml +++ b/.github/workflows/java-firestore-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-pubsub-ci.yaml b/.github/workflows/java-pubsub-ci.yaml index c4723c36b6f0..f0e9d4f05b80 100644 --- a/.github/workflows/java-pubsub-ci.yaml +++ b/.github/workflows/java-pubsub-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-spanner-jdbc-ci.yaml b/.github/workflows/java-spanner-jdbc-ci.yaml index 4cbb5184193a..f3da655c477b 100644 --- a/.github/workflows/java-spanner-jdbc-ci.yaml +++ b/.github/workflows/java-spanner-jdbc-ci.yaml @@ -47,7 +47,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-storage-nio-ci.yaml b/.github/workflows/java-storage-nio-ci.yaml index efddd8ac27fd..c7be8db2a222 100644 --- a/.github/workflows/java-storage-nio-ci.yaml +++ b/.github/workflows/java-storage-nio-ci.yaml @@ -47,7 +47,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/sdk-platform-java-ci.yaml b/.github/workflows/sdk-platform-java-ci.yaml index 2ec5c3b86c9c..8d4e0f306f2d 100644 --- a/.github/workflows/sdk-platform-java-ci.yaml +++ b/.github/workflows/sdk-platform-java-ci.yaml @@ -26,7 +26,7 @@ jobs: name: sdk-platform-java units strategy: matrix: - java: [ 11, 17, 21, 25 ] + java: [ 11, 17, 21, 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -164,16 +164,21 @@ jobs: run: | bazelisk --batch test //sdk-platform-java/test/integration/... --test_output=errors - bazel-25: + # JDK 24+ permanently disables Security Manager. Bazel's default test runner tries to install it. + # We must explicitly disable this behavior using shouldInstallTestSecurityManager=false. + bazel-no-security-manager-jdk24-plus: needs: filter if: ${{ needs.filter.outputs.library == 'true' }} runs-on: ubuntu-22.04 - name: sdk-platform-java integration (25) + name: sdk-platform-java integration (JDK 24+) + strategy: + matrix: + java: [ 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: - java-version: 25 + java-version: ${{ matrix.java }} distribution: temurin cache: maven - run: bazelisk version diff --git a/.github/workflows/showcase.yaml b/.github/workflows/showcase.yaml index 6548576f0ca3..bb9901619966 100644 --- a/.github/workflows/showcase.yaml +++ b/.github/workflows/showcase.yaml @@ -101,7 +101,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - java: [ 11, 17, 21, 25 ] + java: [ 11, 17, 21, 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index 19e138dab615..e1b3fabd302d 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -22,6 +22,10 @@ false java.header + 2.48.0 + + -g @@ -129,6 +133,47 @@ + + + errorprone-jdk11 + + [1.8,17) + + + 2.38.0 + -g + + + + + errorprone-jdk17 + + [17,21) + + + 2.42.0 + -g + + + + + errorprone-jdk21 + + 21 + + + -XDaddTypeAnnotationsToSymbol=true + + diff --git a/java-bigtable/google-cloud-bigtable/pom.xml b/java-bigtable/google-cloud-bigtable/pom.xml index 77308d29c87e..cc2ac2d0ea30 100644 --- a/java-bigtable/google-cloud-bigtable/pom.xml +++ b/java-bigtable/google-cloud-bigtable/pom.xml @@ -441,6 +441,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepDisableWarningsInGeneratedCode -Xep:MissingSummary:OFF -Xep:InlineMeSuggester:OFF -Xep:AutoValueImmutableFields:OFF -Xep:ObjectEqualsForPrimitives:OFF -Xep:JavaDurationGetSecondsToToSeconds:OFF + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -457,7 +458,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java index f2f217ab56b5..f7c7bb43cb46 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java @@ -47,7 +47,7 @@ public void testFromProto() { assertThat(result.getState()).isEqualTo(Cluster.State.READY); assertThat(result.getServeNodes()).isEqualTo(30); assertThat(result.getStorageType()).isEqualTo(StorageType.SSD); - assertThat(result.getKmsKeyName()).isEqualTo(null); + assertThat(result.getKmsKeyName()).isNull(); } @Test diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java index 55df4aee7f82..4c81aeb09396 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java @@ -23,7 +23,6 @@ import com.google.cloud.opentelemetry.detection.GCPPlatformDetector.SupportedPlatform; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import java.util.Map; import org.junit.jupiter.api.Test; @@ -33,7 +32,7 @@ @ExtendWith(MockitoExtension.class) class EnvInfoTest { - private static final Supplier NULL_HOST = Suppliers.ofInstance(null); + private static final Supplier NULL_HOST = () -> null; @SuppressWarnings("UnnecessaryLambda") private static final Function NULL_ENV = (ignored) -> null; diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java index 4472c433f713..e31e58d66423 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java @@ -218,7 +218,7 @@ public void testReadRowsOpCount() throws InterruptedException { } @Test - @SuppressWarnings("FutureReturnValueIgnored") + @SuppressWarnings({"FutureReturnValueIgnored", "NullArgumentForNonNullParameter"}) public void testReadRowsFirstRow() throws InterruptedException { final long beforeSleep = 50; final long afterSleep = 50; diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java index 28b741e09548..ba78793c5a6b 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java @@ -23,7 +23,6 @@ import com.google.common.truth.Subject; import com.google.rpc.RetryInfo; import java.time.Duration; -import java.util.Optional; import javax.annotation.Nullable; public final class VRpcResultSubject extends Subject { @@ -47,12 +46,14 @@ public void hasRetryInfo() { } public ComparableSubject retryInfoDelay() { - return check("retryInfo.delay") - .that( - Optional.ofNullable(actual.getRetryInfo()) - .map(RetryInfo::getRetryDelay) - .map(d -> Duration.ofSeconds(d.getSeconds()).plus(Duration.ofNanos(d.getNanos()))) - .orElse(null)); + RetryInfo retryInfo = actual.getRetryInfo(); + Duration delay = null; + if (retryInfo != null) { + delay = + Duration.ofSeconds(retryInfo.getRetryDelay().getSeconds()) + .plus(Duration.ofNanos(retryInfo.getRetryDelay().getNanos())); + } + return check("retryInfo.delay").that(delay); } public ComparableSubject backendLatency() { diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java index 74d05e37fea2..5ab809f31b41 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java @@ -81,6 +81,7 @@ public void tearDown() throws Exception { } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void outstandingRequestsFinishAfterClose() throws Exception { ApiFuture> resultFuture = stub.readRowsCallable().all().futureCall(Query.create(TableId.of("table1"))); @@ -99,6 +100,7 @@ public void outstandingRequestsFinishAfterClose() throws Exception { class FakeBigtable extends BigtableGrpc.BigtableImplBase { @Override + @SuppressWarnings("NullArgumentForNonNullParameter") public void readRows( ReadRowsRequest request, StreamObserver responseObserver) { diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java index a21eb3d707be..f20ad1a3e5fd 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java @@ -371,6 +371,7 @@ public void testRMWRequestResponseConversion() throws ExecutionException, Interr } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void testMutateRowRequestResponseConversion() throws ExecutionException, InterruptedException { RowMutation req = RowMutation.create(TableId.of("my-table"), "my-key").deleteRow(); @@ -385,10 +386,11 @@ public void testMutateRowRequestResponseConversion() MutateRowRequest protoReq = fakeDataService.mutateRowRequests.poll(1, TimeUnit.SECONDS); assertThat(protoReq) .isEqualTo(req.toProto(RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID))); - assertThat(f.get()).isEqualTo(null); + assertThat(f.get()).isNull(); } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void testMutateRowRequestParams() throws ExecutionException, InterruptedException { RowMutation req = RowMutation.create(TABLE_ID, "my-key").deleteRow(); @@ -407,7 +409,7 @@ public void testMutateRowRequestParams() throws ExecutionException, InterruptedE // StatsHeadersUnaryCallable assertThat(reqMetadata.keys()).contains("bigtable-client-attempt-epoch-usec"); - assertThat(f.get()).isEqualTo(null); + assertThat(f.get()).isNull(); } @Test diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java index 6adc71cae0c0..576dd919448b 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java @@ -185,7 +185,7 @@ public void testManyToOne() throws InterruptedException { // First downstream request makes the upstream over produce outerObserver.getController().request(1); Truth.assertThat(outerObserver.popNextResponse()).isEqualTo("a"); - Truth.assertThat(outerObserver.popNextResponse()).isEqualTo(null); + Truth.assertThat(outerObserver.popNextResponse()).isNull(); Truth.assertThat(outerObserver.isDone()).isFalse(); // Next downstream request should fetch from buffer diff --git a/java-bigtable/pom.xml b/java-bigtable/pom.xml index d0fe7683abdf..551958703180 100644 --- a/java-bigtable/pom.xml +++ b/java-bigtable/pom.xml @@ -145,8 +145,6 @@ google-cloud-bigtable-parent https://googleapis.dev/java/google-api-grpc/latest - - 2.38.0 diff --git a/java-datastore/datastore-v1-proto-client/pom.xml b/java-datastore/datastore-v1-proto-client/pom.xml index 3bea6a35fec2..4de8accacc3f 100644 --- a/java-datastore/datastore-v1-proto-client/pom.xml +++ b/java-datastore/datastore-v1-proto-client/pom.xml @@ -146,6 +146,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -163,7 +164,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/google-cloud-datastore-utils/pom.xml b/java-datastore/google-cloud-datastore-utils/pom.xml index b0533059163a..dff5f9750d59 100644 --- a/java-datastore/google-cloud-datastore-utils/pom.xml +++ b/java-datastore/google-cloud-datastore-utils/pom.xml @@ -123,6 +123,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -140,7 +141,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/google-cloud-datastore/pom.xml b/java-datastore/google-cloud-datastore/pom.xml index d6c2acdfc05c..54a09e2ac8ad 100644 --- a/java-datastore/google-cloud-datastore/pom.xml +++ b/java-datastore/google-cloud-datastore/pom.xml @@ -291,6 +291,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -308,7 +309,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java index 33e90a66e802..fd99328b7c89 100644 --- a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java +++ b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java @@ -16,7 +16,6 @@ package com.google.cloud.datastore; -import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.Arrays; @@ -38,11 +37,13 @@ static Key allocateId(Datastore service, IncompleteKey key) { } static Entity get(Transaction reader, Key key) { - return Iterators.getNext(reader.get(new Key[] {key}), null); + Iterator results = reader.get(new Key[] {key}); + return results.hasNext() ? results.next() : null; } static Entity get(Datastore reader, Key key, ReadOption... options) { - return Iterators.getNext(reader.get(Collections.singletonList(key), options), null); + Iterator results = reader.get(Collections.singletonList(key), options); + return results.hasNext() ? results.next() : null; } static Entity add(DatastoreWriter writer, FullEntity entity) { diff --git a/java-datastore/pom.xml b/java-datastore/pom.xml index 2e4889d4519e..2ceaf50a1ca7 100644 --- a/java-datastore/pom.xml +++ b/java-datastore/pom.xml @@ -144,10 +144,6 @@ github google-cloud-datastore-parent https://googleapis.dev/java/google-api-grpc/latest - - - - 2.42.0