From 2eda8ebbf0179f806bab8a771a64138f129a81e6 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Mon, 25 May 2026 07:05:43 -0400 Subject: [PATCH 1/7] test: provide Micrometer histogram bounds in no-SLA test Micrometer requires valid expected histogram bounds even when SLA buckets are disabled. Stub the lowest, highest, and precision options in the no-SLA session metric test so it exercises the intended branch instead of failing while constructing the distribution configuration. --- .../metrics/micrometer/MicrometerSessionMetricUpdaterTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/metrics/micrometer/src/test/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerSessionMetricUpdaterTest.java b/metrics/micrometer/src/test/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerSessionMetricUpdaterTest.java index 0deb377457a..79f7c3a8ff7 100644 --- a/metrics/micrometer/src/test/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerSessionMetricUpdaterTest.java +++ b/metrics/micrometer/src/test/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerSessionMetricUpdaterTest.java @@ -132,6 +132,9 @@ public void should_not_create_sla_percentiles( when(context.getMetricIdGenerator()).thenReturn(generator); when(profile.getDuration(DefaultDriverOption.METRICS_NODE_EXPIRE_AFTER)) .thenReturn(Duration.ofHours(1)); + when(profile.getDuration(lowest)).thenReturn(Duration.ofMillis(10)); + when(profile.getDuration(highest)).thenReturn(Duration.ofSeconds(1)); + when(profile.getInt(digits)).thenReturn(5); when(profile.isDefined(sla)).thenReturn(false); when(profile.getDurationList(sla)) .thenReturn(Arrays.asList(Duration.ofMillis(100), Duration.ofMillis(500))); From ea914400d0e89ca2eef3b1d45657eace3c404834 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 24 May 2026 19:56:08 -0400 Subject: [PATCH 2/7] build: drop Java 8 support Raise the supported runtime and build floor to Java 11, and align docs, configuration, formatting, and dependency versions with that baseline. --- .github/workflows/docs-pages.yml | 4 +- .github/workflows/docs-pr.yml | 6 +- .github/workflows/release.yml | 4 +- .github/workflows/tests@v1.yml | 20 ++-- LICENSE_binary | 8 +- README-dev.md | 2 +- README.md | 2 +- core-shaded/pom.xml | 3 + .../core/data/time/DateRangePrecision.java | 6 +- .../oss/driver/api/core/CqlIdentifier.java | 3 +- .../api/core/context/DriverContext.java | 49 +++++---- .../oss/driver/api/core/metrics/Metrics.java | 1 + .../api/core/type/reflect/GenericType.java | 1 + .../SubnetAddressTranslator.java | 8 +- .../DefaultLoadBalancingPolicy.java | 4 - .../core/insights/InsightsClientTest.java | 2 +- .../internal/core/ContactPointsTest.java | 44 ++++++-- .../FixedHostNameAddressTranslatorTest.java | 3 +- .../core/type/util/VIntCodingTest.java | 2 +- distribution/pom.xml | 25 +++++ examples/pom.xml | 6 +- faq/README.md | 2 +- guava-shaded/pom.xml | 27 +---- guava-shaded/src/assembly/shaded-jar.xml | 1 + .../core/ssl/DefaultSslEngineFactoryIT.java | 2 +- manual/core/address_resolution/README.md | 2 +- manual/core/async/README.md | 4 +- manual/core/custom_codecs/README.md | 22 ++-- manual/core/integration/README.md | 8 +- manual/core/metadata/schema/README.md | 2 +- manual/core/paging/README.md | 2 +- manual/mapper/config/README.md | 6 +- manual/mapper/daos/delete/README.md | 4 +- manual/mapper/daos/getentity/README.md | 3 +- manual/mapper/daos/increment/README.md | 4 +- manual/mapper/daos/insert/README.md | 6 +- manual/mapper/daos/query/README.md | 8 +- manual/mapper/daos/select/README.md | 8 +- manual/mapper/daos/update/README.md | 6 +- .../mapper/processor/util/Classes.java | 2 +- performance/duration-test.yaml | 4 +- pom.xml | 104 ++++++++---------- .../driver/api/testinfra/ccm/CcmBridge.java | 3 +- 43 files changed, 223 insertions(+), 210 deletions(-) diff --git a/.github/workflows/docs-pages.yml b/.github/workflows/docs-pages.yml index 973da8bfaa2..7ec207fad09 100644 --- a/.github/workflows/docs-pages.yml +++ b/.github/workflows/docs-pages.yml @@ -36,10 +36,10 @@ jobs: with: python-version: '3.13' - - name: Set up JDK 8.0 + - name: Set up JDK 11 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: - java-version: '8' + java-version: '11' distribution: 'temurin' - name: Install uv diff --git a/.github/workflows/docs-pr.yml b/.github/workflows/docs-pr.yml index 58143e854f6..744838e1dc3 100644 --- a/.github/workflows/docs-pr.yml +++ b/.github/workflows/docs-pr.yml @@ -31,10 +31,10 @@ jobs: with: python-version: '3.13' - - name: Set up JDK 8.0 + - name: Set up JDK 11 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: - java-version: '8' + java-version: '11' distribution: 'temurin' - name: Install uv @@ -44,4 +44,4 @@ jobs: run: make -C docs setupenv - name: Build docs - run: make -C docs test \ No newline at end of file + run: make -C docs test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3a55f680e7e..8c1aed7c783 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,10 +39,10 @@ jobs: RELEASE_TARGET_TAG: ${{ inputs.target-tag }} run: make checkout-one-commit-before - - name: Set up Java + - name: Set up JDK 11 uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: - java-version: '8' + java-version: '11' distribution: 'temurin' server-id: central gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} diff --git a/.github/workflows/tests@v1.yml b/.github/workflows/tests@v1.yml index 0f8d9dac934..063dfe2c6f7 100644 --- a/.github/workflows/tests@v1.yml +++ b/.github/workflows/tests@v1.yml @@ -35,7 +35,7 @@ jobs: strategy: matrix: - java-version: [8] + java-version: [11, 17] fail-fast: false steps: @@ -80,7 +80,7 @@ jobs: strategy: matrix: - java-version: [8] + java-version: [11, 17] fail-fast: false steps: @@ -109,14 +109,14 @@ jobs: strategy: matrix: - java-version: [8] + java-version: [11, 17] fail-fast: false steps: - name: Checkout source uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - name: Set up JDK 8 + - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 with: java-version: ${{ matrix.java-version }} @@ -142,14 +142,14 @@ jobs: uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: always() with: - name: test-results + name: test-results-${{ matrix.java-version }} path: "*/**/target/*-reports/*.xml" - name: Parse test results uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5.6.2 if: always() with: - check_name: Unit tests report + check_name: Unit tests report (JDK ${{ matrix.java-version }}) require_tests: true report_paths: "*/**/target/*-reports/*.xml" follow_symlink: true @@ -180,7 +180,7 @@ jobs: strategy: matrix: cassandra-version: [3-LATEST, 4-LATEST] - java-version: [8] + java-version: [11, 17] test-group: [parallelizable, serial, isolated] fail-fast: false @@ -278,7 +278,7 @@ jobs: uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5.6.2 if: always() with: - check_name: Integration tests report for Cassandra ${{ steps.cassandra-version.outputs.value }} (${{ matrix.test-group }}) + check_name: Integration tests report for Cassandra ${{ steps.cassandra-version.outputs.value }} (${{ matrix.test-group }}, JDK ${{ matrix.java-version }}) require_tests: true report_paths: "*/**/target/*-reports/*.xml" follow_symlink: true @@ -295,7 +295,7 @@ jobs: strategy: matrix: scylla-version: [LTS-LATEST, LTS-PRIOR, LATEST] - java-version: [8] + java-version: [11, 17] test-group: [parallelizable, serial, isolated] fail-fast: false @@ -391,7 +391,7 @@ jobs: uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5.6.2 if: always() with: - check_name: Integration tests report for Scylla ${{ steps.scylla-version.outputs.value }} (${{ matrix.test-group }}) + check_name: Integration tests report for Scylla ${{ steps.scylla-version.outputs.value }} (${{ matrix.test-group }}, JDK ${{ matrix.java-version }}) require_tests: true report_paths: "*/**/target/*-reports/*.xml" follow_symlink: true diff --git a/LICENSE_binary b/LICENSE_binary index b59c6ec22bb..b4e9444159b 100644 --- a/LICENSE_binary +++ b/LICENSE_binary @@ -222,7 +222,7 @@ Copyright (C) 2018 Christian Stein This product includes software developed by Christian Stein see ci/install-jdk.sh -This product bundles Java Native Runtime - POSIX 3.1.15, +This product bundles Java Native Runtime - POSIX 3.1.22, which is available under the Eclipse Public License version 2.0. see licenses/jnr-posix.txt @@ -234,14 +234,14 @@ This product bundles ASM 9.2: a very small and fast Java bytecode manipulation f which is available under the 3-Clause BSD License. see licenses/asm.txt -This product bundles HdrHistogram 2.1.12: A High Dynamic Range (HDR) Histogram, +This product bundles HdrHistogram 2.2.2: A High Dynamic Range (HDR) Histogram, which is available under the 2-Clause BSD License. see licenses/HdrHistogram.txt -This product bundles The Simple Logging Facade for Java (SLF4J) API 1.7.26, +This product bundles The Simple Logging Facade for Java (SLF4J) API 2.0.18, which is available under the MIT License. see licenses/slf4j-api.txt -This product bundles Reactive Streams 1.0.3, +This product bundles Reactive Streams 1.0.4, which is available under the MIT License. see licenses/reactive-streams.txt diff --git a/README-dev.md b/README-dev.md index 5b8c85c6f92..07a4673f8a2 100644 --- a/README-dev.md +++ b/README-dev.md @@ -6,7 +6,7 @@ To build the documentation of this project, you need a UNIX-based operating syst You also need the following software installed to generate the reference documentation of the driver: -- Java JDK 8 or higher +- Java JDK 11 or higher - Maven Once you have installed the above software, you can build and preview the documentation by following the steps outlined in the `Quickstart guide `_. diff --git a/README.md b/README.md index 97447249ca0..cc0e3f8fae1 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ builder](manual/query_builder/), [mapper](manual/mapper)). The driver is compatible with Scylla and Apache Cassandra® 2.1 and higher. -It requires Java 8 or higher. +It requires Java 11 or higher. ## Migrating from previous versions diff --git a/core-shaded/pom.xml b/core-shaded/pom.xml index bf776b91e67..7775d4ad2a7 100644 --- a/core-shaded/pom.xml +++ b/core-shaded/pom.xml @@ -280,6 +280,9 @@ maven-javadoc-plugin + + true + attach-javadocs diff --git a/core/src/main/java/com/datastax/dse/driver/api/core/data/time/DateRangePrecision.java b/core/src/main/java/com/datastax/dse/driver/api/core/data/time/DateRangePrecision.java index ce811466c38..a0b5d0e5500 100644 --- a/core/src/main/java/com/datastax/dse/driver/api/core/data/time/DateRangePrecision.java +++ b/core/src/main/java/com/datastax/dse/driver/api/core/data/time/DateRangePrecision.java @@ -131,9 +131,9 @@ public enum DateRangePrecision { private final ChronoUnit roundingUnit; // The formatter is only used for formatting (parsing is done with DateRangeUtil.parseCalendar to // be exactly the same as DSE's). - // If that ever were to change, note that DateTimeFormatters with a time zone have a parsing bug - // in Java 8: the formatter's zone will always be used, even if the input string specifies one - // explicitly. + // If that ever were to change, note that DateTimeFormatters with a time zone had a parsing bug + // on older JDKs: the formatter's zone would always be used, even if the input string specified + // one explicitly. // See https://stackoverflow.com/questions/41999421 private final DateTimeFormatter formatter; diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/CqlIdentifier.java b/core/src/main/java/com/datastax/oss/driver/api/core/CqlIdentifier.java index 82e4c2b30a6..f11d7fa601a 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/CqlIdentifier.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/CqlIdentifier.java @@ -43,7 +43,8 @@ * * Examples: * - * + *
+ * * * * diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java b/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java index 6f0afd3df8a..0bb7098d445 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/context/DriverContext.java @@ -49,25 +49,26 @@ public interface DriverContext extends AttachmentPoint { @NonNull String getSessionName(); - /** @return The driver's configuration; never {@code null}. */ + /** Returns the driver's configuration; never {@code null}. */ @NonNull DriverConfig getConfig(); - /** @return The driver's configuration loader; never {@code null}. */ + /** Returns the driver's configuration loader; never {@code null}. */ @NonNull DriverConfigLoader getConfigLoader(); /** - * @return The driver's load balancing policies, keyed by profile name; the returned map is - * guaranteed to never be {@code null} and to always contain an entry for the {@value - * DriverExecutionProfile#DEFAULT_NAME} profile. + * Returns the driver's load balancing policies, keyed by profile name; the returned map is + * guaranteed to never be {@code null} and to always contain an entry for the {@value + * DriverExecutionProfile#DEFAULT_NAME} profile. */ @NonNull Map getLoadBalancingPolicies(); /** + * Returns the driver's load balancing policy for the given profile; never {@code null}. + * * @param profileName the profile name; never {@code null}. - * @return The driver's load balancing policy for the given profile; never {@code null}. */ @NonNull default LoadBalancingPolicy getLoadBalancingPolicy(@NonNull String profileName) { @@ -79,16 +80,17 @@ default LoadBalancingPolicy getLoadBalancingPolicy(@NonNull String profileName) } /** - * @return The driver's retry policies, keyed by profile name; the returned map is guaranteed to - * never be {@code null} and to always contain an entry for the {@value - * DriverExecutionProfile#DEFAULT_NAME} profile. + * Returns the driver's retry policies, keyed by profile name; the returned map is guaranteed to + * never be {@code null} and to always contain an entry for the {@value + * DriverExecutionProfile#DEFAULT_NAME} profile. */ @NonNull Map getRetryPolicies(); /** + * Returns the driver's retry policy for the given profile; never {@code null}. + * * @param profileName the profile name; never {@code null}. - * @return The driver's retry policy for the given profile; never {@code null}. */ @NonNull default RetryPolicy getRetryPolicy(@NonNull String profileName) { @@ -97,16 +99,17 @@ default RetryPolicy getRetryPolicy(@NonNull String profileName) { } /** - * @return The driver's speculative execution policies, keyed by profile name; the returned map is - * guaranteed to never be {@code null} and to always contain an entry for the {@value - * DriverExecutionProfile#DEFAULT_NAME} profile. + * Returns the driver's speculative execution policies, keyed by profile name; the returned map is + * guaranteed to never be {@code null} and to always contain an entry for the {@value + * DriverExecutionProfile#DEFAULT_NAME} profile. */ @NonNull Map getSpeculativeExecutionPolicies(); /** + * Returns the driver's speculative execution policy for the given profile; never {@code null}. + * * @param profileName the profile name; never {@code null}. - * @return The driver's speculative execution policy for the given profile; never {@code null}. */ @NonNull default SpeculativeExecutionPolicy getSpeculativeExecutionPolicy(@NonNull String profileName) { @@ -116,27 +119,27 @@ default SpeculativeExecutionPolicy getSpeculativeExecutionPolicy(@NonNull String : getSpeculativeExecutionPolicies().get(DriverExecutionProfile.DEFAULT_NAME); } - /** @return The driver's timestamp generator; never {@code null}. */ + /** Returns the driver's timestamp generator; never {@code null}. */ @NonNull TimestampGenerator getTimestampGenerator(); - /** @return The driver's reconnection policy; never {@code null}. */ + /** Returns the driver's reconnection policy; never {@code null}. */ @NonNull ReconnectionPolicy getReconnectionPolicy(); - /** @return The driver's address translator; never {@code null}. */ + /** Returns the driver's address translator; never {@code null}. */ @NonNull AddressTranslator getAddressTranslator(); - /** @return The authentication provider, if authentication was configured. */ + /** Returns the authentication provider, if authentication was configured. */ @NonNull Optional getAuthProvider(); - /** @return The SSL engine factory, if SSL was configured. */ + /** Returns the SSL engine factory, if SSL was configured. */ @NonNull Optional getSslEngineFactory(); - /** @return The driver's request tracker; never {@code null}. */ + /** Returns the driver's request tracker; never {@code null}. */ @NonNull RequestTracker getRequestTracker(); @@ -144,15 +147,15 @@ default SpeculativeExecutionPolicy getSpeculativeExecutionPolicy(@NonNull String @NonNull Optional getRequestIdGenerator(); - /** @return The driver's request throttler; never {@code null}. */ + /** Returns the driver's request throttler; never {@code null}. */ @NonNull RequestThrottler getRequestThrottler(); - /** @return The driver's node state listener; never {@code null}. */ + /** Returns the driver's node state listener; never {@code null}. */ @NonNull NodeStateListener getNodeStateListener(); - /** @return The driver's schema change listener; never {@code null}. */ + /** Returns the driver's schema change listener; never {@code null}. */ @NonNull SchemaChangeListener getSchemaChangeListener(); } diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/metrics/Metrics.java b/core/src/main/java/com/datastax/oss/driver/api/core/metrics/Metrics.java index 58d531b3464..2cd294f6d3a 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/metrics/Metrics.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/metrics/Metrics.java @@ -42,6 +42,7 @@ public interface Metrics { * (Dropwizard Metrics manual) * @leaks-private-api */ + @SuppressWarnings("InvalidBlockTag") @NonNull MetricRegistry getRegistry(); diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/type/reflect/GenericType.java b/core/src/main/java/com/datastax/oss/driver/api/core/type/reflect/GenericType.java index d22b6f1bfaf..efe869660bb 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/type/reflect/GenericType.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/type/reflect/GenericType.java @@ -370,6 +370,7 @@ public final Type getType() { * * @leaks-private-api */ + @SuppressWarnings("InvalidBlockTag") @NonNull public TypeToken __getToken() { return token; diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/SubnetAddressTranslator.java b/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/SubnetAddressTranslator.java index 85f29e3fadd..59f614cad59 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/SubnetAddressTranslator.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/SubnetAddressTranslator.java @@ -61,8 +61,12 @@ public SubnetAddressTranslator(@NonNull DriverContext context) { .getDefaultProfile() .getBoolean(ADDRESS_TRANSLATOR_RESOLVE_ADDRESSES, false); this.subnetAddresses = - context.getConfig().getDefaultProfile().getStringMap(ADDRESS_TRANSLATOR_SUBNET_ADDRESSES) - .entrySet().stream() + context + .getConfig() + .getDefaultProfile() + .getStringMap(ADDRESS_TRANSLATOR_SUBNET_ADDRESSES) + .entrySet() + .stream() .map( e -> { // Quoted and/or containing forward slashes map keys in reference.conf are read to diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/DefaultLoadBalancingPolicy.java b/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/DefaultLoadBalancingPolicy.java index 09a4dff653f..ee563dbc770 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/DefaultLoadBalancingPolicy.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/loadbalancing/DefaultLoadBalancingPolicy.java @@ -331,10 +331,6 @@ private NodeResponseRateSample() { this.newest = OptionalLong.empty(); } - private NodeResponseRateSample(long oldestSample) { - this(oldestSample, nanoTime()); - } - private NodeResponseRateSample(long oldestSample, long newestSample) { this.oldest = oldestSample; this.newest = OptionalLong.of(newestSample); diff --git a/core/src/test/java/com/datastax/dse/driver/internal/core/insights/InsightsClientTest.java b/core/src/test/java/com/datastax/dse/driver/internal/core/insights/InsightsClientTest.java index 74869893b72..5085432dbec 100644 --- a/core/src/test/java/com/datastax/dse/driver/internal/core/insights/InsightsClientTest.java +++ b/core/src/test/java/com/datastax/dse/driver/internal/core/insights/InsightsClientTest.java @@ -109,7 +109,7 @@ public void should_construct_json_event_startup_message() throws IOException { OS os = new OS("linux", "1.2", "x64"); CPUS cpus = new CPUS(8, "intel i7"); Map javaDeps = - ImmutableMap.of("version", new RuntimeAndCompileTimeVersions("1.8.0", "1.8.0", false)); + ImmutableMap.of("version", new RuntimeAndCompileTimeVersions("11.0.0", "11.0.0", false)); Map> runtimeInfo = ImmutableMap.of("java", javaDeps); InsightsPlatformInfo insightsPlatformInfo = new InsightsPlatformInfo(os, cpus, runtimeInfo); diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/ContactPointsTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/ContactPointsTest.java index 72b875b8602..4428e36c53f 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/ContactPointsTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/ContactPointsTest.java @@ -73,8 +73,7 @@ public void should_parse_ipv4_address_and_port_in_configuration() { Set endPoints = ContactPoints.merge(Collections.emptySet(), ImmutableList.of("127.0.0.1:9042"), true); - assertThat(endPoints) - .containsExactly(new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042))); + assertThat(endPoints).containsExactly(new DefaultEndPoint(socketAddress("127.0.0.1", 9042))); } @Test @@ -85,8 +84,8 @@ public void should_parse_ipv6_address_and_port_in_configuration() { assertThat(endPoints) .containsExactly( - new DefaultEndPoint(new InetSocketAddress("::1", 9042)), - new DefaultEndPoint(new InetSocketAddress("::2", 9042))); + new DefaultEndPoint(socketAddress("::1", 9042)), + new DefaultEndPoint(socketAddress("::2", 9042))); } @Test @@ -139,26 +138,25 @@ public void should_ignore_malformed_port_and_warn() { public void should_merge_programmatic_and_configuration() { Set endPoints = ContactPoints.merge( - ImmutableSet.of(new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042))), + ImmutableSet.of(new DefaultEndPoint(socketAddress("127.0.0.1", 9042))), ImmutableList.of("127.0.0.2:9042"), true); assertThat(endPoints) .containsOnly( - new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042)), - new DefaultEndPoint(new InetSocketAddress("127.0.0.2", 9042))); + new DefaultEndPoint(socketAddress("127.0.0.1", 9042)), + new DefaultEndPoint(socketAddress("127.0.0.2", 9042))); } @Test public void should_warn_if_duplicate_between_programmatic_and_configuration() { Set endPoints = ContactPoints.merge( - ImmutableSet.of(new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042))), + ImmutableSet.of(new DefaultEndPoint(socketAddress("127.0.0.1", 9042))), ImmutableList.of("127.0.0.1:9042"), true); - assertThat(endPoints) - .containsOnly(new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042))); + assertThat(endPoints).containsOnly(new DefaultEndPoint(socketAddress("127.0.0.1", 9042))); assertLog(Level.WARN, "Duplicate contact point /127.0.0.1:9042"); } @@ -168,11 +166,33 @@ public void should_warn_if_duplicate_in_configuration() { ContactPoints.merge( Collections.emptySet(), ImmutableList.of("127.0.0.1:9042", "127.0.0.1:9042"), true); - assertThat(endPoints) - .containsOnly(new DefaultEndPoint(new InetSocketAddress("127.0.0.1", 9042))); + assertThat(endPoints).containsOnly(new DefaultEndPoint(socketAddress("127.0.0.1", 9042))); assertLog(Level.WARN, "Duplicate contact point /127.0.0.1:9042"); } + private static InetSocketAddress socketAddress(String host, int port) { + try { + switch (host) { + case "127.0.0.1": + return new InetSocketAddress(InetAddress.getByAddress(new byte[] {127, 0, 0, 1}), port); + case "127.0.0.2": + return new InetSocketAddress(InetAddress.getByAddress(new byte[] {127, 0, 0, 2}), port); + case "::1": + return new InetSocketAddress( + InetAddress.getByAddress(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}), + port); + case "::2": + return new InetSocketAddress( + InetAddress.getByAddress(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}), + port); + default: + return new InetSocketAddress(InetAddress.getByName(host), port); + } + } catch (UnknownHostException e) { + throw new AssertionError(e); + } + } + private void assertLog(Level level, String message) { verify(appender, atLeast(1)).doAppend(loggingEventCaptor.capture()); Iterable logs = diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/addresstranslation/FixedHostNameAddressTranslatorTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/addresstranslation/FixedHostNameAddressTranslatorTest.java index 92800998056..da9c40f033c 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/addresstranslation/FixedHostNameAddressTranslatorTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/addresstranslation/FixedHostNameAddressTranslatorTest.java @@ -42,6 +42,7 @@ public void should_translate_address() { new FixedHostNameAddressTranslator(defaultDriverContext); InetSocketAddress address = new InetSocketAddress("192.0.2.5", 6061); - assertThat(translator.translate(address)).isEqualTo(new InetSocketAddress("myaddress", 6061)); + assertThat(translator.translate(address)) + .isEqualTo(InetSocketAddress.createUnresolved("myaddress", 6061)); } } diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/type/util/VIntCodingTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/type/util/VIntCodingTest.java index b85d6d66844..12a2d10c82d 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/type/util/VIntCodingTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/type/util/VIntCodingTest.java @@ -41,7 +41,7 @@ public static Object[] roundTripTestValues() { -1, 1 }; - }; + } private static final long[] LONGS = new long[] { diff --git a/distribution/pom.xml b/distribution/pom.xml index bf86d2e1fe8..b73b60e09cc 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -115,6 +115,26 @@ Java driver for Scylla and Apache Cassandra® ${project.version} API Java driver for Scylla and Apache Cassandra(R) ${project.version} API + + com.github.stephenc.jcip + jcip-annotations + 1.0-1 + + + com.github.spotbugs + spotbugs-annotations + 4.9.8 + + + com.google.code.findbugs + jsr305 + 3.0.2 + + + com.esri.geometry + esri-geometry-api + ${esri.version} + at.yawk.lz4 lz4-java @@ -135,6 +155,11 @@ tinkergraph-gremlin ${tinkerpop.version} + + org.javatuples + javatuples + 1.2 + diff --git a/examples/pom.xml b/examples/pom.xml index 0d9a5c64373..ac1835142fa 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -130,7 +130,7 @@ at.favre.lib bcrypt - 0.8.0 + 0.10.2 @@ -148,8 +148,8 @@ maven-compiler-plugin - 1.8 - 1.8 + 11 + 11 com.scylladb diff --git a/faq/README.md b/faq/README.md index 97cb4decd00..5bd02fab6f6 100644 --- a/faq/README.md +++ b/faq/README.md @@ -106,7 +106,7 @@ available. ### I want to set a date on a bound statement, where did `setTimestamp()` go? -The driver now uses Java 8's improved date and time API. CQL type `timestamp` is mapped to +The driver now uses the JDK's improved date and time API. CQL type `timestamp` is mapped to `java.time.Instant`, and the corresponding getter and setter are `getInstant` and `setInstant`. See [Temporal types](../manual/core/temporal_types/) for more details. diff --git a/guava-shaded/pom.xml b/guava-shaded/pom.xml index 27d5b69077d..8578787660b 100644 --- a/guava-shaded/pom.xml +++ b/guava-shaded/pom.xml @@ -57,32 +57,6 @@ - - - org.codehaus.mojo - build-helper-maven-plugin - 1.12 - - - regex-property - - regex-property - - - maven.main.skip - ${java.version} - ^(?!1.8).+ - true - false - - - - maven-shade-plugin @@ -159,6 +133,7 @@ java-driver-guava-shaded ${project.version} jar + **/module-info.class diff --git a/guava-shaded/src/assembly/shaded-jar.xml b/guava-shaded/src/assembly/shaded-jar.xml index 4a2eac46316..f660d62a196 100644 --- a/guava-shaded/src/assembly/shaded-jar.xml +++ b/guava-shaded/src/assembly/shaded-jar.xml @@ -38,6 +38,7 @@ ${project.build.outputDirectory} META-INF/maven/com.scylladb/java-driver-guava-shaded/pom.xml + **/module-info.class diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/ssl/DefaultSslEngineFactoryIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/ssl/DefaultSslEngineFactoryIT.java index 50c9561ff9a..1c7b8b06fa2 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/ssl/DefaultSslEngineFactoryIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/ssl/DefaultSslEngineFactoryIT.java @@ -117,7 +117,7 @@ protected String hostNoLookup(InetSocketAddress addr) { countNoLookups++; return super.hostNoLookup(addr); } - }; + } @Test public void should_respect_config_for_san_resolution() { diff --git a/manual/core/address_resolution/README.md b/manual/core/address_resolution/README.md index 0d80312d82d..ae44feea3ea 100644 --- a/manual/core/address_resolution/README.md +++ b/manual/core/address_resolution/README.md @@ -185,7 +185,7 @@ datastax-java-driver { DNS is resolved at connection time (not at route discovery time). The driver delegates to `InetAddress.getByName()`, which is a blocking call that uses the JVM's built-in DNS cache -(30 s default TTL in Java 8+). Because this runs on Netty I/O threads, slow or unresponsive +(30 s default TTL in the JDK). Because this runs on Netty I/O threads, slow or unresponsive DNS can block connection establishment and impact driver throughput. To mitigate this, configure the JVM DNS cache TTL via the `networkaddress.cache.ttl` security property (e.g. in `$JAVA_HOME/conf/security/java.security` or programmatically with diff --git a/manual/core/async/README.md b/manual/core/async/README.md index 5b4bac3dccf..24601020b32 100644 --- a/manual/core/async/README.md +++ b/manual/core/async/README.md @@ -21,7 +21,7 @@ under the License. ### Quick overview -Async driver methods return Java 8's [CompletionStage]. +Async driver methods return the JDK's [CompletionStage]. * don't call synchronous methods from asynchronous callbacks (the driver detects that and throws). * callbacks execute on I/O threads: consider providing your own executor for expensive computations. @@ -224,6 +224,6 @@ even when iterating through the results of a request. `session.executeAsync` ret This greatly simplifies asynchronous paging; see the [paging](../paging/#asynchronous-paging) documentation for more details and an example. -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html [AsyncResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/AsyncResultSet.html diff --git a/manual/core/custom_codecs/README.md b/manual/core/custom_codecs/README.md index f3b7be1e3d9..038766a56f1 100644 --- a/manual/core/custom_codecs/README.md +++ b/manual/core/custom_codecs/README.md @@ -698,17 +698,17 @@ private static String formatRow(Row row) { [MappingCodec]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/type/codec/MappingCodec.html [SessionBuilder.addTypeCodecs]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/session/SessionBuilder.html#addTypeCodecs-com.datastax.oss.driver.api.core.type.codec.TypeCodec...- -[Enums]: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html -[Enum.name()]: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#name-- -[Enum.ordinal()]: https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html#ordinal-- -[java.nio.ByteBuffer]: https://docs.oracle.com/javase/8/docs/api/java/nio/ByteBuffer.html -[java.util.List]: https://docs.oracle.com/javase/8/docs/api/java/util/List.html -[java.util.Optional]: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html -[Optional.empty()]: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html#empty-- -[java.time.Instant]: https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html -[java.time.ZonedDateTime]: https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html -[java.time.LocalDateTime]: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html -[java.time.ZoneId]: https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html +[Enums]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html +[Enum.name()]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html#name-- +[Enum.ordinal()]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Enum.html#ordinal-- +[java.nio.ByteBuffer]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/ByteBuffer.html +[java.util.List]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/List.html +[java.util.Optional]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html +[Optional.empty()]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html#empty-- +[java.time.Instant]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/Instant.html +[java.time.ZonedDateTime]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/ZonedDateTime.html +[java.time.LocalDateTime]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/LocalDateTime.html +[java.time.ZoneId]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/ZoneId.html [ExtraTypeCodecs]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/type/codec/ExtraTypeCodecs.html [ExtraTypeCodecs.BLOB_TO_ARRAY]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/type/codec/ExtraTypeCodecs.html#BLOB_TO_ARRAY diff --git a/manual/core/integration/README.md b/manual/core/integration/README.md index af52bad6792..4ec1dd59312 100644 --- a/manual/core/integration/README.md +++ b/manual/core/integration/README.md @@ -134,7 +134,7 @@ $ find . -type f ##### Project descriptor `pom.xml` is the [Project Object Model][maven_pom] that describes your application. We declare the -dependencies, and tell Maven that we're going to use Java 8: +dependencies, and tell Maven that we're going to use Java 11: ```xml @@ -165,8 +165,8 @@ dependencies, and tell Maven that we're going to use Java 8: maven-compiler-plugin - 1.8 - 1.8 + 11 + 11 @@ -281,7 +281,7 @@ version '1.0.0-SNAPSHOT' apply plugin: 'java' -sourceCompatibility = 1.8 +sourceCompatibility = 11 repositories { mavenCentral() diff --git a/manual/core/metadata/schema/README.md b/manual/core/metadata/schema/README.md index 673c87e57ed..ae119a20b57 100644 --- a/manual/core/metadata/schema/README.md +++ b/manual/core/metadata/schema/README.md @@ -352,4 +352,4 @@ take a look at the [Performance](../../performance/#schema-updates) page for a f [DseAggregateMetadata]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/core/metadata/schema/DseAggregateMetadata.html [JAVA-750]: https://datastax-oss.atlassian.net/browse/JAVA-750 -[java.util.regex.Pattern]: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html +[java.util.regex.Pattern]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html diff --git a/manual/core/paging/README.md b/manual/core/paging/README.md index 2df92bd69d1..99c7cecde9b 100644 --- a/manual/core/paging/README.md +++ b/manual/core/paging/README.md @@ -279,6 +279,6 @@ and offset paging. [OffsetPager]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/paging/OffsetPager.html [PagingState]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/PagingState.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html [driver examples]: https://github.com/datastax/java-driver/tree/4.x/examples/src/main/java/com/datastax/oss/driver/examples/paging diff --git a/manual/mapper/config/README.md b/manual/mapper/config/README.md index 0154b03deaf..c4fe9ef0ce7 100644 --- a/manual/mapper/config/README.md +++ b/manual/mapper/config/README.md @@ -52,8 +52,8 @@ configuration (make sure you use version 3.5 or higher): maven-compiler-plugin 3.8.1 - 1.8 - 1.8 + 11 + 11 com.scylladb @@ -65,7 +65,7 @@ configuration (make sure you use version 3.5 or higher): org.slf4j slf4j-nop - 1.7.26 + 2.0.18 diff --git a/manual/mapper/daos/delete/README.md b/manual/mapper/daos/delete/README.md index e67ecdc8a6e..1d9f9c6cb9b 100644 --- a/manual/mapper/daos/delete/README.md +++ b/manual/mapper/daos/delete/README.md @@ -181,5 +181,5 @@ entity class and the [naming strategy](../../entities/#naming-strategy)). [ReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/core/cql/reactive/ReactiveResultSet.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html diff --git a/manual/mapper/daos/getentity/README.md b/manual/mapper/daos/getentity/README.md index de9a530b558..7b54aeddc38 100644 --- a/manual/mapper/daos/getentity/README.md +++ b/manual/mapper/daos/getentity/README.md @@ -159,7 +159,6 @@ If the return type doesn't match the parameter type (for example [PagingIterable [Row]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/Row.html [UdtValue]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/data/UdtValue.html -[Stream]: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html - +[Stream]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html diff --git a/manual/mapper/daos/increment/README.md b/manual/mapper/daos/increment/README.md index 44b017be2e1..275c2272139 100644 --- a/manual/mapper/daos/increment/README.md +++ b/manual/mapper/daos/increment/README.md @@ -101,5 +101,5 @@ entity class and the naming convention). [@PartitionKey]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/mapper/annotations/PartitionKey.html [@CqlName]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/mapper/annotations/CqlName.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html diff --git a/manual/mapper/daos/insert/README.md b/manual/mapper/daos/insert/README.md index b90ffa33a32..bf9e5f223f8 100644 --- a/manual/mapper/daos/insert/README.md +++ b/manual/mapper/daos/insert/README.md @@ -135,6 +135,6 @@ entity class and the [naming strategy](../../entities/#naming-strategy)). [BoundStatement]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/BoundStatement.html [ReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/core/cql/reactive/ReactiveResultSet.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html -[Optional]: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html +[Optional]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html diff --git a/manual/mapper/daos/query/README.md b/manual/mapper/daos/query/README.md index a11753da880..e7b3c62e974 100644 --- a/manual/mapper/daos/query/README.md +++ b/manual/mapper/daos/query/README.md @@ -145,7 +145,7 @@ Then: [ReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/core/cql/reactive/ReactiveResultSet.html [MappedReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/mapper/reactive/MappedReactiveResultSet.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html -[Optional]: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html -[Stream]: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html +[Optional]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html +[Stream]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html diff --git a/manual/mapper/daos/select/README.md b/manual/mapper/daos/select/README.md index fb6c4ca2077..d72715f61c4 100644 --- a/manual/mapper/daos/select/README.md +++ b/manual/mapper/daos/select/README.md @@ -194,7 +194,7 @@ entity class and the [naming strategy](../../entities/#naming-strategy)). [PagingIterable.spliterator]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/PagingIterable.html#spliterator-- [MappedReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/mapper/reactive/MappedReactiveResultSet.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html -[Optional]: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html -[Stream]: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html +[Optional]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html +[Stream]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html diff --git a/manual/mapper/daos/update/README.md b/manual/mapper/daos/update/README.md index 87e9286c800..c87441a6e9d 100644 --- a/manual/mapper/daos/update/README.md +++ b/manual/mapper/daos/update/README.md @@ -166,9 +166,9 @@ entity class and the naming convention). [@Update]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/mapper/annotations/Update.html [AsyncResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/AsyncResultSet.html -[Boolean]: https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/Boolean.html -[CompletionStage]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html -[CompletableFuture]: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html +[Boolean]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Boolean.html +[CompletionStage]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletionStage.html +[CompletableFuture]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/CompletableFuture.html [ResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/ResultSet.html [BoundStatement]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/oss/driver/api/core/cql/BoundStatement.html [ReactiveResultSet]: https://docs.datastax.com/en/drivers/java/4.17/com/datastax/dse/driver/api/core/cql/reactive/ReactiveResultSet.html diff --git a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/util/Classes.java b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/util/Classes.java index de45d36769d..ffd2651d033 100644 --- a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/util/Classes.java +++ b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/util/Classes.java @@ -106,7 +106,7 @@ public boolean isMap(DeclaredType declaredType) { } /** - * Whether a type mirror is a parameterized Java 8 future ({@code CompletionStage or + * Whether a type mirror is a parameterized future such as {@code CompletionStage} or {@code * CompletableFuture}. */ public boolean isFuture(DeclaredType declaredType) { diff --git a/performance/duration-test.yaml b/performance/duration-test.yaml index 6e718f2add8..de76b9e1e1f 100644 --- a/performance/duration-test.yaml +++ b/performance/duration-test.yaml @@ -47,7 +47,7 @@ ensemble: configuration_manager: - name: ctool properties: - java.version: openjdk8 + java.version: openjdk11 product.install.type: tarball product.type: {{server_type}} product.version: {{server_version}} @@ -69,7 +69,7 @@ ensemble: configuration_manager: - name: ctool properties: - java.version: openjdk8 + java.version: openjdk11 install.maven: true - name: java_driver properties: diff --git a/pom.xml b/pom.xml index e7e570a5e36..75f1d327a86 100644 --- a/pom.xml +++ b/pom.xml @@ -54,10 +54,10 @@ UTF-8 UTF-8 - 1.4.5 + 1.4.8 2.2.2 - 4.2.37 + 4.2.38 4.1.133.Final 1.2.1 3.5.6 - 1.7.36 + 2.0.18 1.0.4 20250517 - 2.21.1 - 2.20.0 + 2.21.3 + 2.21.3 1.9.12 1.1.10.8 - 1.10.1 + 1.11.0 3.27.7 - 1.5.0 + 1.6.0 4.13.2 - 1.2.13 + 1.5.32 6.0.0 7.0.5 4.13.4 2.6.17 - 0.13.0.0 + 0.14.0.0 1.1.4 2.47 2.6.1 @@ -94,7 +94,7 @@ 2.2.21 4.3.0 2.0.0-M19 - 3.5.4 + 3.5.5 22.0.0.2 false ${skipTests} @@ -182,7 +182,7 @@ com.google.guava guava - 33.3.1-jre + 33.6.0-jre com.typesafe @@ -213,7 +213,7 @@ com.github.jnr jnr-posix - 3.1.20 + 3.1.22 io.dropwizard.metrics @@ -281,7 +281,7 @@ com.github.spotbugs spotbugs-annotations - 4.9.6 + 4.9.8 com.squareup @@ -306,12 +306,12 @@ net.bytebuddy byte-buddy - 1.17.7 + 1.18.8-jdk5 org.mockito mockito-core - 2.28.2 + 5.23.0 io.reactivex.rxjava2 @@ -441,7 +441,7 @@ org.testng testng - 7.5.1 + 7.12.0 org.apache.directory.server @@ -553,7 +553,7 @@ maven-compiler-plugin - 3.8.1 + 3.15.0 org.apache.maven.plugins @@ -563,7 +563,7 @@ com.coveo fmt-maven-plugin - 2.9 + 2.13 au.com.acegi @@ -580,17 +580,17 @@ maven-shade-plugin - 3.6.1 + 3.6.2 maven-assembly-plugin - 3.7.1 + 3.8.0 net.alchim31.maven scala-maven-plugin - 4.9.6 + 4.9.10 2.11 @@ -601,7 +601,7 @@ maven-source-plugin - 3.3.1 + 3.4.0 maven-javadoc-plugin @@ -609,7 +609,7 @@ maven-jar-plugin - 3.4.2 + 3.5.0 maven-gpg-plugin @@ -617,7 +617,7 @@ maven-release-plugin - 2.5.3 + 3.3.1 maven-install-plugin @@ -641,12 +641,12 @@ maven-dependency-plugin - 3.9.0 + 3.10.0 org.jacoco jacoco-maven-plugin - 0.8.13 + 0.8.14 org.apache.felix @@ -687,7 +687,7 @@ org.codehaus.mojo versions-maven-plugin - 2.19.1 + 2.21.0 org.codehaus.mojo @@ -705,7 +705,7 @@ org.sonatype.central central-publishing-maven-plugin - 0.8.0 + 0.10.0 true central @@ -717,33 +717,24 @@ maven-compiler-plugin - javac-with-errorprone - true - 1.8 - 1.8 + 11 + 11 - -Xep:FutureReturnValueIgnored:OFF - -Xep:PreferJavaTimeOverload:OFF - -Xep:AnnotateFormatMethod:OFF - -Xep:WildcardImport:WARN - -XepExcludedPaths:.*/target/(?:generated-sources|generated-test-sources)/.* + -XDcompilePolicy=simple + --should-stop=ifError=FLOW + -Xplugin:ErrorProne -Xep:FutureReturnValueIgnored:OFF -Xep:PreferJavaTimeOverload:OFF -Xep:AnnotateFormatMethod:OFF -Xep:WildcardImport:WARN -Xep:MissingSummary:OFF -Xep:StringCaseLocaleUsage:OFF -Xep:InlineMeSuggester:OFF -Xep:AddressSelection:OFF -XepExcludedPaths:.*/target/(?:generated-sources|generated-test-sources)/.* + + + com.google.errorprone + error_prone_core + 2.31.0 + + true true false - - - org.codehaus.plexus - plexus-compiler-javac-errorprone - 2.8.6 - - - com.google.errorprone - error_prone_core - 2.3.4 - - com.coveo @@ -842,6 +833,7 @@ false true all,-missing + true com.datastax.*.driver.internal* @@ -849,12 +841,9 @@ a API note: - + - leaks + leaks-private-api X @@ -1086,13 +1075,6 @@ height="0" width="0" style="display:none;visibility:hidden"> ${testJavaHome} - - - test-jdk-8 - - [8,) - - test-jdk-11 diff --git a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java index e7b2b4e4a02..e35c8013e35 100644 --- a/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java +++ b/test-infra/src/main/java/com/datastax/oss/driver/api/testinfra/ccm/CcmBridge.java @@ -279,7 +279,8 @@ private static Version parseCcmVersion() { if (configDir != null) { execute(CommandLine.parse("ccm remove get_version --config-dir=" + configDir)); } - } catch (Exception ignored) { + } catch (Exception e) { + LOG.warn("Failed to remove temporary CCM cluster used to resolve {}", versionString, e); } } return result; From f6ded502b665829f57249a0c0283077d3fb8093b Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 24 May 2026 19:56:08 -0400 Subject: [PATCH 3/7] fix: validate non-numeric subnet prefixes Reject invalid subnet prefix strings so address translation fails clearly instead of accepting bad configuration. --- .../internal/core/graph/GraphSON2SerdeTP.java | 2 +- .../core/insights/InsightsClient.java | 3 +-- .../internal/core/insights/PackageUtil.java | 17 +++--------- .../core/insights/PlatformInfoFinder.java | 14 +++++----- .../core/insights/schema/InsightMetadata.java | 2 +- .../schema/DefaultDseAggregateMetadata.java | 1 - .../oss/driver/api/core/data/CqlVector.java | 2 +- .../api/core/metadata/token/Partitioner.java | 2 +- .../driver/api/core/retry/RetryVerdict.java | 1 + .../type/codec/registry/CodecRegistry.java | 1 + .../Ec2MultiRegionAddressTranslator.java | 1 + .../internal/core/channel/ChannelFactory.java | 3 +-- .../internal/core/cql/DefaultTraceEvent.java | 1 + .../metadata/ClientRoutesTopologyMonitor.java | 7 +++-- .../core/metadata/DefaultTabletMap.java | 11 ++++---- .../core/metadata/PartitionerFactory.java | 2 +- .../core/metadata/schema/ScriptBuilder.java | 5 ++-- .../metadata/schema/parsing/RawColumn.java | 3 +-- .../queries/RuleBasedKeyspaceFilter.java | 4 +-- .../metadata/token/RandomTokenFactory.java | 6 ++--- .../core/metadata/token/TokenLong64.java | 3 +-- .../core/ssl/ReloadingKeyManagerFactory.java | 2 +- .../core/type/codec/extras/OptionalCodec.java | 4 +-- .../codec/extras/enums/EnumOrdinalCodec.java | 1 + .../core/util/collection/QueryPlan.java | 1 + .../core/graph/GraphSupportCheckerTest.java | 4 +-- .../internal/core/CompletionStageAssert.java | 2 ++ .../channel/MockChannelFactoryHelper.java | 4 +-- .../core/data/AccessibleByIdTestBase.java | 26 +++++++++---------- .../core/data/AccessibleByIndexTestBase.java | 14 +++++----- .../session/MockChannelPoolFactoryHelper.java | 4 +-- .../core/type/codec/TupleCodecTest.java | 12 ++++----- .../core/type/codec/UdtCodecTest.java | 18 ++++++------- .../registry/CachingCodecRegistryTest.java | 15 ++++++----- pom.xml | 2 +- 35 files changed, 98 insertions(+), 102 deletions(-) diff --git a/core/src/main/java/com/datastax/dse/driver/internal/core/graph/GraphSON2SerdeTP.java b/core/src/main/java/com/datastax/dse/driver/internal/core/graph/GraphSON2SerdeTP.java index d79afc71822..05e09b018ab 100644 --- a/core/src/main/java/com/datastax/dse/driver/internal/core/graph/GraphSON2SerdeTP.java +++ b/core/src/main/java/com/datastax/dse/driver/internal/core/graph/GraphSON2SerdeTP.java @@ -403,7 +403,7 @@ static final class ObjectGraphNodeGraphSON2Serializer extends StdSerializer new Date().getTime(), + System::currentTimeMillis, insightsConfiguration, new PlatformInfoFinder(), new ReconnectionPolicyInfoFinder(), diff --git a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PackageUtil.java b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PackageUtil.java index 3c61dec4f20..c7e15bbdfae 100644 --- a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PackageUtil.java +++ b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PackageUtil.java @@ -18,9 +18,6 @@ package com.datastax.dse.driver.internal.core.insights; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; -import com.datastax.oss.driver.shaded.guava.common.base.Joiner; -import java.util.Arrays; -import java.util.regex.Pattern; class PackageUtil { static final String DEFAULT_SPECULATIVE_EXECUTION_PACKAGE = @@ -28,8 +25,6 @@ class PackageUtil { static final String DEFAULT_LOAD_BALANCING_PACKAGE = "com.datastax.oss.driver.internal.core.loadbalancing"; static final String DEFAULT_AUTH_PROVIDER_PACKAGE = "com.datastax.oss.driver.internal.core.auth"; - private static final Pattern PACKAGE_SPLIT_REGEX = Pattern.compile("\\."); - private static final Joiner DOT_JOINER = Joiner.on("."); static String getNamespace(Class tClass) { String namespace = ""; @@ -61,18 +56,14 @@ private static ClassSettingDetails getClassSettingDetails( @VisibleForTesting static String getClassName(String classSetting) { - String[] split = PACKAGE_SPLIT_REGEX.split(classSetting); - if (split.length == 0) { - return ""; - } - return split[split.length - 1]; + int lastDot = classSetting.lastIndexOf('.'); + return lastDot < 0 ? classSetting : classSetting.substring(lastDot + 1); } @VisibleForTesting static String getFullPackageOrDefault(String classSetting, String defaultValue) { - String[] split = PACKAGE_SPLIT_REGEX.split(classSetting); - if (split.length <= 1) return defaultValue; - return DOT_JOINER.join(Arrays.copyOf(split, split.length - 1)); + int lastDot = classSetting.lastIndexOf('.'); + return lastDot < 0 ? defaultValue : classSetting.substring(0, lastDot); } static class ClassSettingDetails { diff --git a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PlatformInfoFinder.java b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PlatformInfoFinder.java index 30d41d40836..84b4d76e8b7 100644 --- a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PlatformInfoFinder.java +++ b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/PlatformInfoFinder.java @@ -24,6 +24,7 @@ import com.datastax.dse.driver.internal.core.insights.schema.InsightsPlatformInfo.CPUS; import com.datastax.oss.driver.internal.core.os.Native; import com.datastax.oss.driver.shaded.guava.common.annotations.VisibleForTesting; +import com.datastax.oss.driver.shaded.guava.common.base.Splitter; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -37,11 +38,10 @@ import java.util.Objects; import java.util.Properties; import java.util.function.Function; -import java.util.regex.Pattern; class PlatformInfoFinder { private static final String MAVEN_IGNORE_LINE = "The following files have been resolved:"; - private static final Pattern DEPENDENCY_SPLIT_REGEX = Pattern.compile(":"); + private static final Splitter DEPENDENCY_SPLITTER = Splitter.on(':'); static final String UNVERIFIED_RUNTIME_VERSION = "UNVERIFIED"; private final Function propertiesUrlProvider; @@ -197,11 +197,13 @@ private List extractMavenDependenciesFromFile(InputStream in } private DependencyFromFile extractDependencyFromLine(String line) { - String[] split = DEPENDENCY_SPLIT_REGEX.split(line); - if (split.length == 6) { // case for i.e.: com.github.jnr:jffi:jar:native:1.2.16:compile - return new DependencyFromFile(split[0], split[1], split[4], checkIsOptional(split[5])); + List split = DEPENDENCY_SPLITTER.splitToList(line); + if (split.size() == 6) { // case for i.e.: com.github.jnr:jffi:jar:native:1.2.16:compile + return new DependencyFromFile( + split.get(0), split.get(1), split.get(4), checkIsOptional(split.get(5))); } else { // case for normal: org.ow2.asm:asm:jar:5.0.3:compile - return new DependencyFromFile(split[0], split[1], split[3], checkIsOptional(split[4])); + return new DependencyFromFile( + split.get(0), split.get(1), split.get(3), checkIsOptional(split.get(4))); } } diff --git a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/schema/InsightMetadata.java b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/schema/InsightMetadata.java index cfa2644b0c7..d7397d813aa 100644 --- a/core/src/main/java/com/datastax/dse/driver/internal/core/insights/schema/InsightMetadata.java +++ b/core/src/main/java/com/datastax/dse/driver/internal/core/insights/schema/InsightMetadata.java @@ -68,7 +68,7 @@ public boolean equals(Object o) { } InsightMetadata that = (InsightMetadata) o; return Objects.equals(name, that.name) - && Objects.equals(timestamp, that.timestamp) + && timestamp == that.timestamp && Objects.equals(tags, that.tags) && insightType == that.insightType && Objects.equals(insightMappingId, that.insightMappingId); diff --git a/core/src/main/java/com/datastax/dse/driver/internal/core/metadata/schema/DefaultDseAggregateMetadata.java b/core/src/main/java/com/datastax/dse/driver/internal/core/metadata/schema/DefaultDseAggregateMetadata.java index 52a0b846076..1baa50e7fb8 100644 --- a/core/src/main/java/com/datastax/dse/driver/internal/core/metadata/schema/DefaultDseAggregateMetadata.java +++ b/core/src/main/java/com/datastax/dse/driver/internal/core/metadata/schema/DefaultDseAggregateMetadata.java @@ -64,7 +64,6 @@ public boolean isDeterministic() { } @Override - @Nullable public Optional getDeterministic() { return Optional.ofNullable(deterministic); } diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/data/CqlVector.java b/core/src/main/java/com/datastax/oss/driver/api/core/data/CqlVector.java index 8089d551750..a3bbe2c8020 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/data/CqlVector.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/data/CqlVector.java @@ -80,7 +80,7 @@ public static CqlVector newInstance(List list) { * Create a new CqlVector instance from the specified string representation. * * @param str a String representation of a CqlVector - * @param subtypeCodec + * @param subtypeCodec the codec used to parse individual vector elements * @return a new CqlVector built from the String representation */ public static CqlVector from(@NonNull String str, @NonNull TypeCodec subtypeCodec) { diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/metadata/token/Partitioner.java b/core/src/main/java/com/datastax/oss/driver/api/core/metadata/token/Partitioner.java index 033058a7084..530cca9d22d 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/metadata/token/Partitioner.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/metadata/token/Partitioner.java @@ -18,7 +18,7 @@ import java.nio.ByteBuffer; -/** Allows to hash partition key to a @code{Token}. */ +/** Allows to hash partition key to a {@code Token}. */ public interface Partitioner { Token hash(ByteBuffer partitionKey); } diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/retry/RetryVerdict.java b/core/src/main/java/com/datastax/oss/driver/api/core/retry/RetryVerdict.java index 9abb54156db..ee51059da07 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/retry/RetryVerdict.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/retry/RetryVerdict.java @@ -27,6 +27,7 @@ * where, and a method that allows the original request to be modified before the retry. */ @FunctionalInterface +@SuppressWarnings("ClassInitializationDeadlock") public interface RetryVerdict { /** A retry verdict that retries the same request on the same node. */ diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/type/codec/registry/CodecRegistry.java b/core/src/main/java/com/datastax/oss/driver/api/core/type/codec/registry/CodecRegistry.java index 36472f34c79..42bfe6535c2 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/type/codec/registry/CodecRegistry.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/type/codec/registry/CodecRegistry.java @@ -57,6 +57,7 @@ public interface CodecRegistry { * but any attempt to {@linkplain MutableCodecRegistry#register(TypeCodec) register new codecs} * will throw {@link UnsupportedOperationException}. */ + @SuppressWarnings("ClassInitializationDeadlock") CodecRegistry DEFAULT = new DefaultCodecRegistry("default") { @Override diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/Ec2MultiRegionAddressTranslator.java b/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/Ec2MultiRegionAddressTranslator.java index 88e6cdb3bb2..bee22dc5335 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/Ec2MultiRegionAddressTranslator.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/addresstranslation/Ec2MultiRegionAddressTranslator.java @@ -54,6 +54,7 @@ * the domain name of the target instance. Then it performs a forward DNS lookup of the domain name; * the EC2 DNS does the private/public switch automatically based on location. */ +@SuppressWarnings("BanJNDI") public class Ec2MultiRegionAddressTranslator implements AddressTranslator { private static final Logger LOG = LoggerFactory.getLogger(Ec2MultiRegionAddressTranslator.class); diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/channel/ChannelFactory.java b/core/src/main/java/com/datastax/oss/driver/internal/core/channel/ChannelFactory.java index 5ad8c111262..6bfc355f910 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/channel/ChannelFactory.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/channel/ChannelFactory.java @@ -410,8 +410,7 @@ protected void initChannel(Channel channel) { ChannelPipeline pipeline = channel.pipeline(); context .getSslHandlerFactory() - .map(f -> f.newSslHandler(channel, endPoint)) - .map(h -> pipeline.addLast(SSL_HANDLER_NAME, h)); + .ifPresent(f -> pipeline.addLast(SSL_HANDLER_NAME, f.newSslHandler(channel, endPoint))); // Only add meter handlers on the pipeline if metrics are enabled. SessionMetricUpdater sessionMetricUpdater = context.getMetricsFactory().getSessionUpdater(); diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/cql/DefaultTraceEvent.java b/core/src/main/java/com/datastax/oss/driver/internal/core/cql/DefaultTraceEvent.java index 9bf7ff7c8ee..e092f8302ec 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/cql/DefaultTraceEvent.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/cql/DefaultTraceEvent.java @@ -78,6 +78,7 @@ public String getThreadName() { } @Override + @SuppressWarnings("JavaUtilDate") public String toString() { return String.format("%s on %s[%s] at %s", activity, source, threadName, new Date(timestamp)); } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/ClientRoutesTopologyMonitor.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/ClientRoutesTopologyMonitor.java index 569637e0873..1ffc35fd9f4 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/ClientRoutesTopologyMonitor.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/ClientRoutesTopologyMonitor.java @@ -55,8 +55,8 @@ public class ClientRoutesTopologyMonitor extends DefaultTopologyMonitor { private static final Logger LOG = LoggerFactory.getLogger(ClientRoutesTopologyMonitor.class); - private static final String SELECT_ROUTES_COLUMNS = - "SELECT host_id, address, port, tls_port, connection_id FROM %s"; + private static final String SELECT_ROUTES_PREFIX = + "SELECT host_id, address, port, tls_port, connection_id FROM "; /** Disables result-set paging, matching the convention used by {@link DefaultTopologyMonitor}. */ private static final int NO_PAGING = -1; @@ -508,8 +508,7 @@ private static String buildQuery( boolean hasConnectionIds = !connectionIds.isEmpty(); boolean hasHostIds = eventHostIds != null && !eventHostIds.isEmpty(); - StringBuilder stmt = - new StringBuilder(String.format(SELECT_ROUTES_COLUMNS, config.getTableName())); + StringBuilder stmt = new StringBuilder(SELECT_ROUTES_PREFIX).append(config.getTableName()); if (hasConnectionIds) { // Prepared statements cannot be used here because AdminRequestHandler only supports diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/DefaultTabletMap.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/DefaultTabletMap.java index c6467a62ca8..a37ba434d0f 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/DefaultTabletMap.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/DefaultTabletMap.java @@ -33,11 +33,12 @@ * *

Thread-safety notes: This class uses ConcurrentMap and ConcurrentSkipListSet underneath. It is * safe to have multiple threads accessing it. However, multiple modifications i.e. multiple calls - * of {@link DefaultTabletMap#addTablet(CqlIdentifier, CqlIdentifier, Tablet) will race with each + * of {@link DefaultTabletMap#addTablet(CqlIdentifier, CqlIdentifier, Tablet)} will race with each * other. This may result in unexpected state of this structure when used in a vacuum. For example - * it may end up containing overlapping tablet ranges.

In actual use by the driver {@link - * MetadataManager} solves this by running modifications sequentially. It schedules them on {@link - * MetadataManager#adminExecutor}}'s thread. + * it may end up containing overlapping tablet ranges. + * + *

In actual use by the driver {@link MetadataManager} solves this by running modifications + * sequentially. It schedules them on the {@link MetadataManager#adminExecutor} thread. */ @Beta public class DefaultTabletMap implements TabletMap { @@ -209,7 +210,7 @@ public static DefaultTablet parseTabletPayloadV1(TupleValue tupleValue, Map 0) { - builder.append(Strings.repeat(" ", indent * INDENT_SIZE)); + builder.append(" ".repeat(indent * INDENT_SIZE)); } isAtLineStart = false; builder.append(s); @@ -65,7 +64,7 @@ public ScriptBuilder newLine() { } public ScriptBuilder forceNewLine(int count) { - builder.append(Strings.repeat("\n", count)); + builder.append("\n".repeat(count)); isAtLineStart = true; return this; } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/parsing/RawColumn.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/parsing/RawColumn.java index 5dc0679deaf..db541df48cb 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/parsing/RawColumn.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/parsing/RawColumn.java @@ -27,7 +27,6 @@ import com.datastax.oss.driver.api.core.metadata.schema.ColumnMetadata; import com.datastax.oss.driver.internal.core.adminrequest.AdminRow; import com.datastax.oss.driver.shaded.guava.common.collect.Lists; -import com.datastax.oss.driver.shaded.guava.common.primitives.Ints; import edu.umd.cs.findbugs.annotations.NonNull; import java.util.Collection; import java.util.Collections; @@ -128,7 +127,7 @@ public int compareTo(@NonNull RawColumn that) { // First, order by kind. Then order partition key and clustering columns by position. For // other kinds, order by column name. if (!this.kind.equals(that.kind)) { - return Ints.compare(rank(this.kind), rank(that.kind)); + return Integer.compare(rank(this.kind), rank(that.kind)); } else if (kind.equals(KIND_PARTITION_KEY) || kind.equals(KIND_CLUSTERING_COLUMN)) { return Integer.compare(this.position, that.position); } else { diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/queries/RuleBasedKeyspaceFilter.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/queries/RuleBasedKeyspaceFilter.java index 38a8c116c45..d78147f41c9 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/queries/RuleBasedKeyspaceFilter.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/schema/queries/RuleBasedKeyspaceFilter.java @@ -79,9 +79,9 @@ class RuleBasedKeyspaceFilter implements KeyspaceFilter { exactExcludes.add(name); } } else if ((matcher = REGEX_INCLUDE.matcher(spec)).matches()) { - compile(matcher.group(1)).map(regexIncludes::add); + compile(matcher.group(1)).ifPresent(regexIncludes::add); } else if ((matcher = REGEX_EXCLUDE.matcher(spec)).matches()) { - compile(matcher.group(1)).map(regexExcludes::add); + compile(matcher.group(1)).ifPresent(regexExcludes::add); } else { LOG.warn( "[{}] Error while parsing {}: invalid element '{}', skipping", diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/RandomTokenFactory.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/RandomTokenFactory.java index 59f1bcc865b..88881bffaa7 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/RandomTokenFactory.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/RandomTokenFactory.java @@ -43,8 +43,7 @@ public RandomTokenFactory() { prototype = createMessageDigest(); boolean supportsClone; try { - prototype.clone(); - supportsClone = true; + supportsClone = prototype.clone() instanceof MessageDigest; } catch (CloneNotSupportedException e) { supportsClone = false; } @@ -104,7 +103,8 @@ private MessageDigest newMessageDigest() { if (supportsClone) { try { return (MessageDigest) prototype.clone(); - } catch (CloneNotSupportedException ignored) { + } catch (CloneNotSupportedException e) { + return createMessageDigest(); } } return createMessageDigest(); diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/TokenLong64.java b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/TokenLong64.java index 4d9d20c1470..32de62a31eb 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/TokenLong64.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/metadata/token/TokenLong64.java @@ -18,7 +18,6 @@ import com.datastax.oss.driver.api.core.metadata.token.Token; import com.datastax.oss.driver.shaded.guava.common.base.Preconditions; -import com.datastax.oss.driver.shaded.guava.common.primitives.Longs; import edu.umd.cs.findbugs.annotations.NonNull; import net.jcip.annotations.Immutable; @@ -57,6 +56,6 @@ public int compareTo(@NonNull Token other) { Preconditions.checkArgument( other instanceof TokenLong64, "Cannot compare with non-64-bit-integer token"); TokenLong64 that = (TokenLong64) other; - return Longs.compare(this.value, that.value); + return Long.compare(this.value, that.value); } } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/ssl/ReloadingKeyManagerFactory.java b/core/src/main/java/com/datastax/oss/driver/internal/core/ssl/ReloadingKeyManagerFactory.java index 8a9e11bb2e9..7131652e182 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/ssl/ReloadingKeyManagerFactory.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/ssl/ReloadingKeyManagerFactory.java @@ -71,7 +71,7 @@ public class ReloadingKeyManagerFactory extends KeyManagerFactory implements Aut * @param keystorePassword the keystore password * @param reloadInterval the duration between reload attempts. Set to {@link Optional#empty()} to * disable scheduled reloading. - * @return + * @return a reloading key manager factory backed by the given keystore */ static ReloadingKeyManagerFactory create( Path keystorePath, String keystorePassword, Optional reloadInterval) diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/OptionalCodec.java b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/OptionalCodec.java index e62e244bf5e..b47771c9d0e 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/OptionalCodec.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/OptionalCodec.java @@ -52,14 +52,14 @@ public boolean accepts(@NonNull Object value) { return false; } - @Nullable @Override protected Optional innerToOuter(@Nullable T value) { - return Optional.ofNullable(isAbsent(value) ? null : value); + return isAbsent(value) ? Optional.empty() : Optional.of(value); } @Nullable @Override + @SuppressWarnings("NullableOptional") protected T outerToInner(@Nullable Optional value) { return value != null && value.isPresent() ? value.get() : null; } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/enums/EnumOrdinalCodec.java b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/enums/EnumOrdinalCodec.java index 4d6ca26484e..091652569b7 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/enums/EnumOrdinalCodec.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/extras/enums/EnumOrdinalCodec.java @@ -54,6 +54,7 @@ protected EnumT innerToOuter(@Nullable Integer value) { @Nullable @Override + @SuppressWarnings("EnumOrdinal") protected Integer outerToInner(@Nullable EnumT value) { return value == null ? null : value.ordinal(); } diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/util/collection/QueryPlan.java b/core/src/main/java/com/datastax/oss/driver/internal/core/util/collection/QueryPlan.java index 371e100a0e2..a5ca3443efc 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/util/collection/QueryPlan.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/util/collection/QueryPlan.java @@ -52,6 +52,7 @@ @ThreadSafe public interface QueryPlan extends Queue { + @SuppressWarnings("ClassInitializationDeadlock") QueryPlan EMPTY = new EmptyQueryPlan(); /** diff --git a/core/src/test/java/com/datastax/dse/driver/internal/core/graph/GraphSupportCheckerTest.java b/core/src/test/java/com/datastax/dse/driver/internal/core/graph/GraphSupportCheckerTest.java index ec31bd4b12d..eda3bbed446 100644 --- a/core/src/test/java/com/datastax/dse/driver/internal/core/graph/GraphSupportCheckerTest.java +++ b/core/src/test/java/com/datastax/dse/driver/internal/core/graph/GraphSupportCheckerTest.java @@ -25,7 +25,7 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.datastax.dse.driver.DseTestDataProviders; @@ -250,7 +250,7 @@ public void should_pickup_graph_protocol_from_statement(GraphProtocol graphProto graphStatement, executionProfile, mock(InternalDriverContext.class)); assertThat(inferredProtocol).isEqualTo(graphProtocol); - verifyZeroInteractions(executionProfile); + verifyNoInteractions(executionProfile); } @Test diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/CompletionStageAssert.java b/core/src/test/java/com/datastax/oss/driver/internal/core/CompletionStageAssert.java index 6c0d78d62dd..f7996a95235 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/CompletionStageAssert.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/CompletionStageAssert.java @@ -69,6 +69,7 @@ public CompletionStageAssert isFailed() { return isFailed(f -> {}); } + @SuppressWarnings("EmptyCatch") public CompletionStageAssert isCancelled() { boolean cancelled = false; try { @@ -83,6 +84,7 @@ public CompletionStageAssert isCancelled() { return this; } + @SuppressWarnings("EmptyCatch") public CompletionStageAssert isNotCancelled() { boolean cancelled = false; try { diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/channel/MockChannelFactoryHelper.java b/core/src/test/java/com/datastax/oss/driver/internal/core/channel/MockChannelFactoryHelper.java index 43768131108..6bc5f2b2025 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/channel/MockChannelFactoryHelper.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/channel/MockChannelFactoryHelper.java @@ -23,7 +23,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.metadata.Node; @@ -122,7 +122,7 @@ public static class Builder { public Builder(ChannelFactory channelFactory) { assertThat(MockUtil.isMock(channelFactory)).as("expected a mock").isTrue(); - verifyZeroInteractions(channelFactory); + verifyNoInteractions(channelFactory); this.channelFactory = channelFactory; } diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIdTestBase.java b/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIdTestBase.java index c27b55e3f25..fb03a7646da 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIdTestBase.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIdTestBase.java @@ -22,7 +22,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.CqlIdentifier; @@ -83,7 +83,7 @@ public void should_set_bytes_by_id() { t = t.setBytesUnsafe(FIELD0_ID, Bytes.fromHexString("0x00000001")); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(FIELD0_ID)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -97,7 +97,7 @@ public void should_set_to_null_by_id() { t = t.setToNull(FIELD0_ID); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(FIELD0_ID)).isNull(); } @@ -144,7 +144,7 @@ public void should_set_with_explicit_codec_by_id() { t = t.set(FIELD0_ID, "1", intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).encode("1", ProtocolVersion.DEFAULT); assertThat(t.getBytesUnsafe(FIELD0_ID)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -189,7 +189,7 @@ public void should_get_bytes_by_id() { ByteBuffer bytes = t.getBytesUnsafe(FIELD0_ID); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(bytes).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -203,7 +203,7 @@ public void should_test_if_null_by_id() { boolean isNull = t.isNull(FIELD0_ID); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(isNull).isTrue(); } @@ -253,7 +253,7 @@ public void should_get_with_explicit_codec_by_id() { String s = t.get(FIELD0_ID, intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).decode(any(ByteBuffer.class), eq(ProtocolVersion.DEFAULT)); assertThat(s).isEqualTo("1"); } @@ -295,7 +295,7 @@ public void should_set_bytes_by_name() { t = t.setBytesUnsafe(FIELD0_NAME, Bytes.fromHexString("0x00000001")); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(FIELD0_NAME)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -309,7 +309,7 @@ public void should_set_to_null_by_name() { t = t.setToNull(FIELD0_NAME); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(FIELD0_NAME)).isNull(); } @@ -356,7 +356,7 @@ public void should_set_with_explicit_codec_by_name() { t = t.set(FIELD0_NAME, "1", intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).encode("1", ProtocolVersion.DEFAULT); assertThat(t.getBytesUnsafe(FIELD0_NAME)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -401,7 +401,7 @@ public void should_get_bytes_by_name() { ByteBuffer bytes = t.getBytesUnsafe(FIELD0_NAME); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(bytes).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -415,7 +415,7 @@ public void should_test_if_null_by_name() { boolean isNull = t.isNull(FIELD0_NAME); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(isNull).isTrue(); } @@ -465,7 +465,7 @@ public void should_get_with_explicit_codec_by_name() { String s = t.get(FIELD0_NAME, intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).decode(any(ByteBuffer.class), eq(ProtocolVersion.DEFAULT)); assertThat(s).isEqualTo("1"); } diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIndexTestBase.java b/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIndexTestBase.java index 94da926f2bc..39ddc3fe12c 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIndexTestBase.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/data/AccessibleByIndexTestBase.java @@ -22,7 +22,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.DefaultProtocolVersion; @@ -121,7 +121,7 @@ public void should_set_bytes_by_index() { t = t.setBytesUnsafe(0, Bytes.fromHexString("0x00000001")); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(0)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -135,7 +135,7 @@ public void should_set_to_null_by_index() { t = t.setToNull(0); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(t.getBytesUnsafe(0)).isNull(); } @@ -182,7 +182,7 @@ public void should_set_with_explicit_codec_by_index() { t = t.set(0, "1", intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).encode("1", ProtocolVersion.DEFAULT); assertThat(t.getBytesUnsafe(0)).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -273,7 +273,7 @@ public void should_get_bytes_by_index() { ByteBuffer bytes = t.getBytesUnsafe(0); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(bytes).isEqualTo(Bytes.fromHexString("0x00000001")); } @@ -287,7 +287,7 @@ public void should_test_if_null_by_index() { boolean isNull = t.isNull(0); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); assertThat(isNull).isTrue(); } @@ -337,7 +337,7 @@ public void should_get_with_explicit_codec_by_index() { String s = t.get(0, intToStringCodec); // Then - verifyZeroInteractions(codecRegistry); + verifyNoInteractions(codecRegistry); verify(intToStringCodec).decode(any(ByteBuffer.class), eq(ProtocolVersion.DEFAULT)); assertThat(s).isEqualTo("1"); } diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/session/MockChannelPoolFactoryHelper.java b/core/src/test/java/com/datastax/oss/driver/internal/core/session/MockChannelPoolFactoryHelper.java index 6c3dc7f3689..e4b96a4427b 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/session/MockChannelPoolFactoryHelper.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/session/MockChannelPoolFactoryHelper.java @@ -23,7 +23,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.CqlIdentifier; @@ -124,7 +124,7 @@ public static class Builder { private Builder(ChannelPoolFactory channelPoolFactory) { assertThat(MockUtil.isMock(channelPoolFactory)).as("expected a mock").isTrue(); - verifyZeroInteractions(channelPoolFactory); + verifyNoInteractions(channelPoolFactory); this.channelPoolFactory = channelPoolFactory; } diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/TupleCodecTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/TupleCodecTest.java index c51eea20c2e..16fa9d9f1c1 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/TupleCodecTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/TupleCodecTest.java @@ -21,8 +21,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.ProtocolVersion; @@ -104,7 +104,7 @@ public void should_encode_tuple() { verify(intCodec).encodePrimitive(1, ProtocolVersion.DEFAULT); // null values are handled directly in the tuple codec, without calling the child codec: - verifyZeroInteractions(doubleCodec); + verifyNoInteractions(doubleCodec); verify(textCodec).encode("a", ProtocolVersion.DEFAULT); } @@ -122,7 +122,7 @@ public void should_decode_tuple() { assertThat(tuple.getString(2)).isEqualTo("a"); verify(intCodec).decodePrimitive(Bytes.fromHexString("0x00000001"), ProtocolVersion.DEFAULT); - verifyZeroInteractions(doubleCodec); + verifyNoInteractions(doubleCodec); verify(textCodec).decode(Bytes.fromHexString("0x61"), ProtocolVersion.DEFAULT); } @@ -141,9 +141,9 @@ public void should_decode_negative_element_length_as_null_field() { assertThat(tuple.isNull(1)).isTrue(); assertThat(tuple.isNull(2)).isTrue(); - verifyZeroInteractions(intCodec); - verifyZeroInteractions(doubleCodec); - verifyZeroInteractions(textCodec); + verifyNoInteractions(intCodec); + verifyNoInteractions(doubleCodec); + verifyNoInteractions(textCodec); } @Test diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/UdtCodecTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/UdtCodecTest.java index af94247f937..cb48ae1e58a 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/UdtCodecTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/UdtCodecTest.java @@ -21,8 +21,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import com.datastax.oss.driver.api.core.CqlIdentifier; @@ -113,7 +113,7 @@ public void should_encode_udt() { verify(intCodec).encodePrimitive(1, ProtocolVersion.DEFAULT); // null values are handled directly in the udt codec, without calling the child codec: - verifyZeroInteractions(doubleCodec); + verifyNoInteractions(doubleCodec); verify(textCodec).encode("a", ProtocolVersion.DEFAULT); } @@ -131,7 +131,7 @@ public void should_decode_udt() { assertThat(udt.getString(2)).isEqualTo("a"); verify(intCodec).decodePrimitive(Bytes.fromHexString("0x00000001"), ProtocolVersion.DEFAULT); - verifyZeroInteractions(doubleCodec); + verifyNoInteractions(doubleCodec); verify(textCodec).decode(Bytes.fromHexString("0x61"), ProtocolVersion.DEFAULT); } @@ -165,9 +165,9 @@ public void should_decode_negative_element_length_as_null_field() { assertThat(udt.isNull(1)).isTrue(); assertThat(udt.isNull(2)).isTrue(); - verifyZeroInteractions(intCodec); - verifyZeroInteractions(doubleCodec); - verifyZeroInteractions(textCodec); + verifyNoInteractions(intCodec); + verifyNoInteractions(doubleCodec); + verifyNoInteractions(textCodec); } @Test @@ -178,9 +178,9 @@ public void should_decode_absent_element_as_null_field() { assertThat(udt.isNull(1)).isTrue(); assertThat(udt.isNull(2)).isTrue(); - verifyZeroInteractions(intCodec); - verifyZeroInteractions(doubleCodec); - verifyZeroInteractions(textCodec); + verifyNoInteractions(intCodec); + verifyNoInteractions(doubleCodec); + verifyNoInteractions(textCodec); } @Test diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/registry/CachingCodecRegistryTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/registry/CachingCodecRegistryTest.java index 231f67a93e7..de5fefd88ae 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/registry/CachingCodecRegistryTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/type/codec/registry/CachingCodecRegistryTest.java @@ -22,7 +22,8 @@ import static org.assertj.core.api.Assertions.fail; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.verifyNoInteractions; +import static org.mockito.Mockito.verifyNoMoreInteractions; import com.datastax.oss.driver.api.core.ProtocolVersion; import com.datastax.oss.driver.api.core.data.TupleValue; @@ -80,7 +81,7 @@ public void should_find_primitive_codecs_for_types(TypeCodec codec) { Class javaClass = (Class) javaType.__getToken().getType(); assertThat(registry.codecFor(cqlType, javaClass)).isSameAs(codec); // Primitive mappings never hit the cache - verifyZeroInteractions(mockCache); + verifyNoInteractions(mockCache); } @Test @@ -90,7 +91,7 @@ public void should_find_primitive_codecs_for_types(TypeCodec codec) { public void should_find_primitive_codecs_for_value(Object value, TypeCodec codec) { TestCachingCodecRegistry registry = new TestCachingCodecRegistry(mockCache); assertThat(registry.codecFor(value)).isEqualTo(codec); - verifyZeroInteractions(mockCache); + verifyNoInteractions(mockCache); } @Test @@ -101,7 +102,7 @@ public void should_find_primitive_codecs_for_cql_type_and_value( DataType cqlType, Object value, TypeCodec codec) { TestCachingCodecRegistry registry = new TestCachingCodecRegistry(mockCache); assertThat(registry.codecFor(cqlType, value)).isEqualTo(codec); - verifyZeroInteractions(mockCache); + verifyNoInteractions(mockCache); } @Test @@ -123,7 +124,7 @@ public void should_find_user_codec_for_built_in_java_type() { assertThat(registry.codecFor(DataTypes.INT)).isSameAs(TypeCodecs.INT); assertThat(registry.codecFor("123")).isSameAs(TypeCodecs.TEXT); - verifyZeroInteractions(mockCache); + verifyNoMoreInteractions(mockCache); } @Test @@ -144,7 +145,7 @@ public void should_find_user_codec_for_custom_java_type() { // The search by CQL type only still returns the built-in codec assertThat(registry.codecFor(DataTypes.TEXT)).isSameAs(TypeCodecs.TEXT); - verifyZeroInteractions(mockCache); + verifyNoMoreInteractions(mockCache); } @Test @@ -521,7 +522,7 @@ public void should_register_user_codec_at_runtime() { assertThat(registry.codecFor(DataTypes.INT)).isSameAs(TypeCodecs.INT); assertThat(registry.codecFor("123")).isSameAs(TypeCodecs.TEXT); - verifyZeroInteractions(mockCache); + verifyNoMoreInteractions(mockCache); } @Test diff --git a/pom.xml b/pom.xml index 75f1d327a86..a4ee47f62c0 100644 --- a/pom.xml +++ b/pom.xml @@ -722,7 +722,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW - -Xplugin:ErrorProne -Xep:FutureReturnValueIgnored:OFF -Xep:PreferJavaTimeOverload:OFF -Xep:AnnotateFormatMethod:OFF -Xep:WildcardImport:WARN -Xep:MissingSummary:OFF -Xep:StringCaseLocaleUsage:OFF -Xep:InlineMeSuggester:OFF -Xep:AddressSelection:OFF -XepExcludedPaths:.*/target/(?:generated-sources|generated-test-sources)/.* + -Xplugin:ErrorProne -Xep:FutureReturnValueIgnored:OFF -Xep:PreferJavaTimeOverload:OFF -Xep:AnnotateFormatMethod:OFF -Xep:WildcardImport:WARN -Xep:MissingSummary:OFF -Xep:StringCaseLocaleUsage:OFF -Xep:InlineMeSuggester:OFF -Xep:AddressSelection:OFF -XepExcludedPaths:.*/(?:src/test|target/(?:generated-sources|generated-test-sources))/.* From 98985ac90f4b0113f83a9bc729753d874fea0d86 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 24 May 2026 20:30:36 -0400 Subject: [PATCH 4/7] refactor: hide mutable primitive codec array PRIMITIVE_CODECS is an array, so final only prevents reassigning the field; callers that can reach a public field can still mutate its contents. The array is only used by codec registry internals, so keep it package-private instead of exposing mutable static state. This avoids MutablePublicArray-style warnings without changing registry behavior. From bcb5c3b371a7d27c149200423165b1687ddd5892 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 24 May 2026 19:56:08 -0400 Subject: [PATCH 5/7] ci: restore Java 11 and JDK 17 validation Update maintained CI paths for the Java 11 baseline, including JDK 17 compiler flags, javadoc skips, authenticated version lookup, examples compilation, and runtime-specific reports. --- .github/workflows/tests@v1.yml | 19 +++++++++++++++++++ .mvn/jvm.config | 11 +++++++++++ examples/pom.xml | 3 +++ .../mapper/processor/MapperProcessor.java | 3 +-- .../processor/dao/DaoReturnTypeKind.java | 2 +- osgi-tests/pom.xml | 3 +++ pom.xml | 15 +++++++++++++-- 7 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 .mvn/jvm.config diff --git a/.github/workflows/tests@v1.yml b/.github/workflows/tests@v1.yml index 063dfe2c6f7..0e3d9c411be 100644 --- a/.github/workflows/tests@v1.yml +++ b/.github/workflows/tests@v1.yml @@ -41,6 +41,8 @@ jobs: steps: - name: Checkout source uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + with: + persist-credentials: false - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 @@ -115,6 +117,8 @@ jobs: steps: - name: Checkout source uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 + with: + persist-credentials: false - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0 @@ -182,6 +186,11 @@ jobs: cassandra-version: [3-LATEST, 4-LATEST] java-version: [11, 17] test-group: [parallelizable, serial, isolated] + exclude: + - cassandra-version: 3-LATEST + java-version: 17 + - cassandra-version: 4-LATEST + java-version: 11 fail-fast: false steps: @@ -212,6 +221,7 @@ jobs: id: cassandra-version env: CASSANDRA_VERSION: ${{ matrix.cassandra-version }} + GET_VERSION_VERSION: 0.4.5 GH_TOKEN: ${{ github.token }} run: make resolve-cassandra-version @@ -226,6 +236,7 @@ jobs: if: steps.ccm-cache.outputs.cache-hit != 'true' env: CASSANDRA_VERSION_RESOLVED: ${{ steps.cassandra-version.outputs.value }} + GET_VERSION_VERSION: 0.4.5 run: make download-cassandra - name: Save CCM image into the cache @@ -249,6 +260,7 @@ jobs: env: CASSANDRA_VERSION: ${{ matrix.cassandra-version }} CASSANDRA_VERSION_RESOLVED: ${{ steps.cassandra-version.outputs.value }} + GET_VERSION_VERSION: 0.4.5 GH_TOKEN: ${{ github.token }} MAVEN_EXTRA_ARGS: ${{ steps.test-skip-args.outputs.value }} run: make test-integration-cassandra @@ -297,6 +309,13 @@ jobs: scylla-version: [LTS-LATEST, LTS-PRIOR, LATEST] java-version: [11, 17] test-group: [parallelizable, serial, isolated] + exclude: + - scylla-version: LTS-PRIOR + java-version: 17 + - scylla-version: LTS-LATEST + java-version: 17 + - scylla-version: LATEST + java-version: 11 fail-fast: false steps: diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 00000000000..c3ad3948530 --- /dev/null +++ b/.mvn/jvm.config @@ -0,0 +1,11 @@ +--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED +--add-exports=jdk.compiler/com.sun.tools.javac.jvm=ALL-UNNAMED diff --git a/examples/pom.xml b/examples/pom.xml index ac1835142fa..8f257b703b0 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -33,6 +33,9 @@ java-driver-examples Java driver for Scylla and Apache Cassandra(R) - examples. A collection of examples to demonstrate Java Driver for Scylla and Apache Cassandra(R). + + true + diff --git a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java index 619a07ea886..1b7c156f18c 100644 --- a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java +++ b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java @@ -20,7 +20,6 @@ import com.datastax.oss.driver.api.mapper.annotations.Dao; import com.datastax.oss.driver.api.mapper.annotations.Entity; import com.datastax.oss.driver.api.mapper.annotations.Mapper; -import com.datastax.oss.driver.shaded.guava.common.base.Strings; import com.datastax.oss.driver.shaded.guava.common.base.Throwables; import com.datastax.oss.driver.shaded.guava.common.collect.ImmutableSet; import java.lang.annotation.Annotation; @@ -167,7 +166,7 @@ private String computeIndent(Map options) { if (amountSpec != null) { try { int amount = Integer.parseInt(amountSpec); - return Strings.repeat(tabs ? "\t" : " ", amount); + return (tabs ? "\t" : " ").repeat(amount); } catch (NumberFormatException e) { messager.warn( "Could not parse %s: expected a number, got '%s'. Defaulting to %s.", diff --git a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/dao/DaoReturnTypeKind.java b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/dao/DaoReturnTypeKind.java index 72089fdccb3..233bf946406 100644 --- a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/dao/DaoReturnTypeKind.java +++ b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/dao/DaoReturnTypeKind.java @@ -40,7 +40,7 @@ public interface DaoReturnTypeKind { * @param helperFieldName the name of the helper for entity conversions (might not get used for * certain kinds, in that case it's ok to pass null). * @param methodElement the return type of the method (in case the result must be cast). - * @param typeParameters + * @param typeParameters the type parameters declared on the DAO method. */ void addExecuteStatement( CodeBlock.Builder methodBuilder, diff --git a/osgi-tests/pom.xml b/osgi-tests/pom.xml index dc9eae882d7..e776519ec6d 100644 --- a/osgi-tests/pom.xml +++ b/osgi-tests/pom.xml @@ -33,6 +33,9 @@ java-driver-osgi-tests jar Java driver for Scylla and Apache Cassandra(R) - OSGi tests + + true + com.scylladb diff --git a/pom.xml b/pom.xml index a4ee47f62c0..79f7be9e35d 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,7 @@ false false + false @@ -717,8 +718,7 @@ maven-compiler-plugin - 11 - 11 + 11 -XDcompilePolicy=simple --should-stop=ifError=FLOW @@ -879,6 +879,7 @@ height="0" width="0" style="display:none;visibility:hidden"> process-classes + ${api.plumber.skip} com.datastax.oss.doclet.ApiPlumber com.datastax.oss @@ -1082,6 +1083,16 @@ height="0" width="0" style="display:none;visibility:hidden"> [11,) + + + skip-api-plumber-on-jdk-13 + + [13,) + + + true + + test-jdk-14 From 4cd0be3868f5f271d4ab36ba926fb936a2753d8d Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Sun, 24 May 2026 19:56:08 -0400 Subject: [PATCH 6/7] test: fix Java 11 test compatibility and CI failures Enable required annotation processors, silence Java 11 compiler warnings, and improve CCM cleanup logging so integration failures are easier to diagnose. Update tests for newer Mockito behavior by avoiding shared MockitoJUnitRunner usage in parallel integration tests and by verifying cache interactions explicitly where the mock behavior changed. Fix CI failures exposed by the updated validation matrix: provide Micrometer histogram bounds in the no-SLA test, register config-change listeners before manual reloads, avoid assuming a transient one-connection node state before reconnection wins the race, and validate prepared-statement invalidation through observable cache behavior instead of a test-only removal-listener latch. --- .../driver/api/core/paging/OffsetPager.java | 6 +-- .../core/metadata/MetadataManagerTest.java | 6 +-- examples/pom.xml | 5 +++ .../examples/paging/ForwardPagingRestUi.java | 2 +- .../examples/paging/RandomPagingRestUi.java | 2 +- integration-tests/pom.xml | 36 ++++++++++++++++++ .../DriverExecutionProfileReloadIT.java | 10 ++++- .../oss/driver/core/metadata/NodeStateIT.java | 10 ++--- .../oss/driver/core/session/ListenersIT.java | 18 +++++++-- .../driver/core/tracker/RequestLoggerIT.java | 17 ++++++--- .../mapper/processor/MapperProcessor.java | 2 +- .../driver/api/mapper/annotations/Delete.java | 6 +-- .../api/mapper/annotations/GetEntity.java | 4 +- .../api/mapper/annotations/Increment.java | 6 +-- .../driver/api/mapper/annotations/Insert.java | 6 +-- .../driver/api/mapper/annotations/Query.java | 6 +-- .../driver/api/mapper/annotations/Select.java | 6 +-- .../api/mapper/annotations/SetEntity.java | 4 +- .../driver/api/mapper/annotations/Update.java | 6 +-- .../micrometer/MicrometerMetricUpdater.java | 6 +-- osgi-tests/pom.xml | 17 +++++++++ test-infra/pom.xml | 5 +++ .../gremlin/PatchedGremlinDslProcessor.java | 38 +++++++++++++++++++ 23 files changed, 174 insertions(+), 50 deletions(-) create mode 100644 test-infra/src/main/java/com/datastax/oss/driver/internal/gremlin/PatchedGremlinDslProcessor.java diff --git a/core/src/main/java/com/datastax/oss/driver/api/core/paging/OffsetPager.java b/core/src/main/java/com/datastax/oss/driver/api/core/paging/OffsetPager.java index 3cb838f3171..03f48652907 100644 --- a/core/src/main/java/com/datastax/oss/driver/api/core/paging/OffsetPager.java +++ b/core/src/main/java/com/datastax/oss/driver/api/core/paging/OffsetPager.java @@ -46,7 +46,7 @@ * a reasonable trade-off if the cardinality stays low. This class provides a way to emulate this * behavior on the client side. * - *

Performance considerations

+ *

Performance considerations

* * For each page that you want to retrieve: * @@ -71,7 +71,7 @@ * OffsetPager.Page<Row> page5 = pager.getPage(rs, 5); * * - *

Establishing application-level guardrails

+ *

Establishing application-level guardrails

* * Linear performance should be fine for the values typically encountered in real-world * applications: for example, if the page size is 25 and users never go past page 10, the worst case @@ -81,7 +81,7 @@ * maximum, so that an attacker can't inject a large value that could potentially fetch millions of * rows. * - *

Relation with protocol-level paging

+ *

Relation with protocol-level paging

* * Protocol-level paging refers to the ability to split large response into multiple network chunks: * see {@link Statement#setPageSize(int)} and {@code basic.request.page-size} in the configuration. diff --git a/core/src/test/java/com/datastax/oss/driver/internal/core/metadata/MetadataManagerTest.java b/core/src/test/java/com/datastax/oss/driver/internal/core/metadata/MetadataManagerTest.java index 9c5cbdba8ee..6fb1384d889 100644 --- a/core/src/test/java/com/datastax/oss/driver/internal/core/metadata/MetadataManagerTest.java +++ b/core/src/test/java/com/datastax/oss/driver/internal/core/metadata/MetadataManagerTest.java @@ -389,9 +389,9 @@ public void refreshSchema_should_drain_queued_refresh_after_newInstance_failure( CompletionStage result2 = metadataManager.refreshSchema("bar", true, true); - // Now complete the agreement check - first refresh will fail at newInstance(), - // and onSchemaRefreshComplete should drain the queued second refresh - agreementFuture.complete(true); + // Now complete the agreement check on the admin event loop - first refresh will fail at + // newInstance(), and onSchemaRefreshComplete should drain the queued second refresh. + adminEventLoopGroup.next().execute(() -> agreementFuture.complete(true)); // Then both requests should complete (not hang forever) waitForPendingAdminTasks( diff --git a/examples/pom.xml b/examples/pom.xml index 8f257b703b0..5ec1487798c 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -154,6 +154,11 @@ 11 11 + + com.google.errorprone + error_prone_core + 2.31.0 + com.scylladb java-driver-mapper-processor diff --git a/examples/src/main/java/com/datastax/oss/driver/examples/paging/ForwardPagingRestUi.java b/examples/src/main/java/com/datastax/oss/driver/examples/paging/ForwardPagingRestUi.java index a512457d618..fe4d6cfa820 100644 --- a/examples/src/main/java/com/datastax/oss/driver/examples/paging/ForwardPagingRestUi.java +++ b/examples/src/main/java/com/datastax/oss/driver/examples/paging/ForwardPagingRestUi.java @@ -119,7 +119,7 @@ private static void populateSchema(CqlSession session) { int videoid = i * 100 + j; session.execute( prepare.bind( - i, "user " + i, Instant.ofEpochMilli(j * 100000), videoid, "video " + videoid)); + i, "user " + i, Instant.ofEpochMilli(j * 100000L), videoid, "video " + videoid)); } } } diff --git a/examples/src/main/java/com/datastax/oss/driver/examples/paging/RandomPagingRestUi.java b/examples/src/main/java/com/datastax/oss/driver/examples/paging/RandomPagingRestUi.java index 7eb3249b0ac..f88c93241ab 100644 --- a/examples/src/main/java/com/datastax/oss/driver/examples/paging/RandomPagingRestUi.java +++ b/examples/src/main/java/com/datastax/oss/driver/examples/paging/RandomPagingRestUi.java @@ -129,7 +129,7 @@ private static void populateSchema(CqlSession session) { int videoid = i * 100 + j; session.execute( prepare.bind( - i, "user " + i, Instant.ofEpochMilli(j * 100000), videoid, "video " + videoid)); + i, "user " + i, Instant.ofEpochMilli(j * 100000L), videoid, "video " + videoid)); } } } diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index 05a3e0a315d..6f790752635 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -231,6 +231,42 @@ + + maven-compiler-plugin + + + -processor + com.datastax.oss.driver.internal.mapper.processor.MapperProcessor,com.datastax.oss.driver.internal.gremlin.PatchedGremlinDslProcessor + + + + com.google.errorprone + error_prone_core + 2.31.0 + + + com.scylladb + java-driver-test-infra + ${project.version} + + + com.scylladb + java-driver-mapper-processor + ${project.version} + + + com.scylladb + java-driver-mapper-runtime + ${project.version} + + + org.apache.tinkerpop + gremlin-core + ${tinkerpop.version} + + + + org.apache.maven.plugins maven-failsafe-plugin diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/config/DriverExecutionProfileReloadIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/config/DriverExecutionProfileReloadIT.java index 48ccc850060..b8c3b73ddaa 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/config/DriverExecutionProfileReloadIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/config/DriverExecutionProfileReloadIT.java @@ -125,8 +125,8 @@ public void should_reload_configuration_when_event_fired() { // Bump up request timeout to 10 seconds and trigger a manual reload. configSource.set("basic.request.timeout = 10s"); - session.getContext().getConfigLoader().reload(); - waitForConfigChange(session, 500, TimeUnit.MILLISECONDS); + waitForConfigChange( + session, () -> session.getContext().getConfigLoader().reload(), 3, TimeUnit.SECONDS); // Execute again, should not timeout. session.execute(query); @@ -217,11 +217,17 @@ public void should_reload_profile_config_when_reloading_config() { } private void waitForConfigChange(CqlSession session, long timeout, TimeUnit unit) { + waitForConfigChange(session, () -> {}, timeout, unit); + } + + private void waitForConfigChange( + CqlSession session, Runnable trigger, long timeout, TimeUnit unit) { CountDownLatch latch = new CountDownLatch(1); ((InternalDriverContext) session.getContext()) .getEventBus() .register(ConfigChangeEvent.class, (e) -> latch.countDown()); try { + trigger.run(); boolean success = latch.await(timeout, unit); assertThat(success).isTrue(); } catch (InterruptedException e) { diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/NodeStateIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/NodeStateIT.java index 41e7b73f2ed..6307b3cec6e 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/NodeStateIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/metadata/NodeStateIT.java @@ -81,12 +81,9 @@ import org.junit.experimental.categories.Category; import org.junit.rules.RuleChain; import org.junit.rules.TestRule; -import org.junit.runner.RunWith; import org.mockito.InOrder; -import org.mockito.junit.MockitoJUnitRunner; @Category(ParallelizableTests.class) -@RunWith(MockitoJUnitRunner.class) public class NodeStateIT { private SimulacronRule simulacron = new SimulacronRule(ClusterSpec.builder().withNodes(2)); @@ -213,10 +210,13 @@ public void should_keep_regular_node_up_when_still_one_connection() { simulacron.cluster().closeConnection(report.getConnections().get(0), CloseType.DISCONNECT); await() - .alias("Reconnection started") + .alias("Regular node stayed up after one connection closed") .pollInterval(500, TimeUnit.MILLISECONDS) .untilAsserted( - () -> assertThat(metadataRegularNode).isUp().hasOpenConnections(1).isReconnecting()); + () -> { + assertThat(metadataRegularNode).isUp(); + assertThat(metadataRegularNode.getOpenConnections()).isBetween(1, 2); + }); inOrder.verify(nodeStateListener, never()).onDown(metadataRegularNode); } diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/session/ListenersIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/session/ListenersIT.java index e23b7fba4e6..c00e4cf863a 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/session/ListenersIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/session/ListenersIT.java @@ -42,19 +42,19 @@ import java.util.Collections; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import org.junit.After; +import org.junit.Before; import org.junit.ClassRule; import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InOrder; import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.MockitoAnnotations; @Category(ParallelizableTests.class) -@RunWith(MockitoJUnitRunner.class) public class ListenersIT { @ClassRule @@ -71,6 +71,18 @@ public class ListenersIT { @Captor private ArgumentCaptor nodeCaptor1; @Captor private ArgumentCaptor nodeCaptor2; + private AutoCloseable mocks; + + @Before + public void setup() { + mocks = MockitoAnnotations.openMocks(this); + } + + @After + public void teardown() throws Exception { + mocks.close(); + } + @Test @Ignore( "@IntegrationTestDisabledFlaky") // sleep after build() fixes the flakiness, session readiness diff --git a/integration-tests/src/test/java/com/datastax/oss/driver/core/tracker/RequestLoggerIT.java b/integration-tests/src/test/java/com/datastax/oss/driver/core/tracker/RequestLoggerIT.java index 20ab395c5a6..45ef528ea36 100644 --- a/integration-tests/src/test/java/com/datastax/oss/driver/core/tracker/RequestLoggerIT.java +++ b/integration-tests/src/test/java/com/datastax/oss/driver/core/tracker/RequestLoggerIT.java @@ -59,16 +59,14 @@ import org.junit.experimental.categories.Category; import org.junit.rules.RuleChain; import org.junit.rules.TestRule; -import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import org.mockito.internal.verification.VerificationModeFactory; -import org.mockito.junit.MockitoJUnitRunner; import org.mockito.verification.Timeout; import org.slf4j.LoggerFactory; -@RunWith(MockitoJUnitRunner.class) @Category(ParallelizableTests.class) public class RequestLoggerIT { private static final Pattern LOG_PREFIX_PER_REQUEST = Pattern.compile("\\[s\\d*\\|\\d*]"); @@ -192,9 +190,11 @@ public class RequestLoggerIT { @Mock private Appender appender; private Logger logger; private Level oldLevel; + private AutoCloseable mocks; @Before public void setup() { + mocks = MockitoAnnotations.openMocks(this); logger = (Logger) LoggerFactory.getLogger(RequestLogger.class); oldLevel = logger.getLevel(); logger.setLevel(Level.INFO); @@ -202,9 +202,14 @@ public void setup() { } @After - public void teardown() { - logger.detachAppender(appender); - logger.setLevel(oldLevel); + public void teardown() throws Exception { + if (logger != null) { + logger.detachAppender(appender); + logger.setLevel(oldLevel); + } + if (mocks != null) { + mocks.close(); + } } @Test diff --git a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java index 1b7c156f18c..ffd1527893e 100644 --- a/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java +++ b/mapper-processor/src/main/java/com/datastax/oss/driver/internal/mapper/processor/MapperProcessor.java @@ -92,7 +92,7 @@ public boolean process( roundEnvironment, Dao.class, ElementKind.INTERFACE, generatorFactory::newDaoImplementation); processAnnotatedTypes( roundEnvironment, Mapper.class, ElementKind.INTERFACE, generatorFactory::newMapper); - return true; + return false; } protected ProcessorContext buildContext( diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Delete.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Delete.java index a9d2c03912f..e1f87e9d414 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Delete.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Delete.java @@ -47,7 +47,7 @@ * } * * - *

Parameters

+ *

Parameters

* * The method can operate either on an entity instance, or on a primary key (partition key + * clustering columns). @@ -77,7 +77,7 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

Return type

+ *

Return type

* * The method can return: * @@ -127,7 +127,7 @@ * practical purpose for that since those queries always return {@code wasApplied = true} and an * empty result set. * - *

Target keyspace and table

+ *

Target keyspace and table

* * If a keyspace was specified when creating the DAO (see {@link DaoFactory}), then the generated * query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/GetEntity.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/GetEntity.java index d86174bdc49..c80d928ee81 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/GetEntity.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/GetEntity.java @@ -55,7 +55,7 @@ *

It does not perform a query. Instead, those methods are intended for cases where you already * have a query result, and just need the conversion logic. * - *

Parameters

+ *

Parameters

* * The method must have a single parameter. The following types are allowed: * @@ -69,7 +69,7 @@ * The data must match the target entity: the generated code will try to extract every mapped * property, and fail if one is missing. * - *

Return type

+ *

Return type

* * The method can return: * diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Increment.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Increment.java index bb86fa5b8ab..b6e0e6d7086 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Increment.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Increment.java @@ -58,7 +58,7 @@ * } * * - *

Parameters

+ *

Parameters

* * The entity class must be specified with {@link #entityClass()}. * @@ -92,12 +92,12 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

Return type

+ *

Return type

* *

The method can return {@code void}, a void {@link CompletionStage} or {@link * CompletableFuture}, or a {@link ReactiveResultSet}. * - *

Target keyspace and table

+ *

Target keyspace and table

* *

If a keyspace was specified when creating the DAO (see {@link DaoFactory}), then the generated * query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Insert.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Insert.java index a00c0e88c21..678c543a14c 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Insert.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Insert.java @@ -48,7 +48,7 @@ * } * * - *

Parameters

+ *

Parameters

* * The first parameter must be the entity to insert. * @@ -66,7 +66,7 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

Return type

+ *

Return type

* * The method can return: * @@ -122,7 +122,7 @@ *
  • a {@linkplain MapperResultProducer custom type}. * * - *

    Target keyspace and table

    + *

    Target keyspace and table

    * * If a keyspace was specified when creating the DAO (see {@link DaoFactory}), then the generated * query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Query.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Query.java index c362453bb3a..65543ab0a7d 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Query.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Query.java @@ -55,7 +55,7 @@ * * This is the equivalent of what was called "accessor methods" in the driver 3 mapper. * - *

    Parameters

    + *

    Parameters

    * * The query string provided in {@link #value()} will typically contain CQL placeholders. The * method's parameters must match those placeholders: same name and a compatible Java type. @@ -70,7 +70,7 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

    Return type

    + *

    Return type

    * * The method can return: * @@ -100,7 +100,7 @@ *
  • a {@linkplain MapperResultProducer custom type}. * * - *

    Target keyspace and table

    + *

    Target keyspace and table

    * * To avoid hard-coding the keyspace and table name, the query string supports 3 additional * placeholders: {@code ${keyspaceId}}, {@code ${tableId}} and {@code ${qualifiedTableId}}. They get diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Select.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Select.java index 53d9a58b6fc..58907049d73 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Select.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Select.java @@ -48,7 +48,7 @@ * } * * - *

    Parameters

    + *

    Parameters

    * * If {@link #customWhereClause()} is empty, the mapper defaults to a selection by primary key * (partition key + clustering columns). The method's parameters must match the types of the primary @@ -87,7 +87,7 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

    Return type

    + *

    Return type

    * *

    In all cases, the method can return: * @@ -132,7 +132,7 @@ *

  • a {@linkplain MapperResultProducer custom type}. * * - *

    Target keyspace and table

    + *

    Target keyspace and table

    * * If a keyspace was specified when creating the DAO (see {@link DaoFactory}), then the generated * query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/SetEntity.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/SetEntity.java index cc1cb9b7e88..82d988e4151 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/SetEntity.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/SetEntity.java @@ -51,7 +51,7 @@ * It does not perform a query. Instead, those methods are intended for cases where you will execute * the query yourself, and just need the conversion logic. * - *

    Parameters

    + *

    Parameters

    * * The method must have two parameters: one is the entity instance, the other must be a subtype of * {@link SettableByName} (the most likely candidates are {@link BoundStatement}, {@link @@ -60,7 +60,7 @@ * *

    The order of the parameters does not matter. * - *

    Return type

    + *

    Return type

    * * The method can either be void, or return the exact same type as its settable parameter. * diff --git a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Update.java b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Update.java index 315ac1ecfe7..e8b2e77de04 100644 --- a/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Update.java +++ b/mapper-runtime/src/main/java/com/datastax/oss/driver/api/mapper/annotations/Update.java @@ -49,7 +49,7 @@ * } * * - *

    Parameters

    + *

    Parameters

    * *

    The first parameter must be an entity instance. All of its non-PK properties will be * interpreted as values to update. @@ -88,7 +88,7 @@ * parameter. It will be applied to the statement before execution. This allows you to customize * certain aspects of the request (page size, timeout, etc) at runtime. * - *

    Return type

    + *

    Return type

    * *

    The method can return: * @@ -135,7 +135,7 @@ *

  • a {@linkplain MapperResultProducer custom type}. * * - *

    Target keyspace and table

    + *

    Target keyspace and table

    * *

    If a keyspace was specified when creating the DAO (see {@link DaoFactory}), then the generated * query targets that keyspace. Otherwise, it doesn't specify a keyspace, and will only work if the diff --git a/metrics/micrometer/src/main/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerMetricUpdater.java b/metrics/micrometer/src/main/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerMetricUpdater.java index b9507c8b7cf..808a963f096 100644 --- a/metrics/micrometer/src/main/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerMetricUpdater.java +++ b/metrics/micrometer/src/main/java/com/datastax/oss/driver/internal/metrics/micrometer/MicrometerMetricUpdater.java @@ -55,14 +55,14 @@ protected MicrometerMetricUpdater( @Override public void incrementCounter(MetricT metric, @Nullable String profileName, long amount) { if (isEnabled(metric, profileName)) { - getOrCreateCounterFor(metric).increment(amount); + getOrCreateCounterFor(metric).increment((double) amount); } } @Override public void updateHistogram(MetricT metric, @Nullable String profileName, long value) { if (isEnabled(metric, profileName)) { - getOrCreateDistributionSummaryFor(metric).record(value); + getOrCreateDistributionSummaryFor(metric).record((double) value); } } @@ -70,7 +70,7 @@ public void updateHistogram(MetricT metric, @Nullable String profileName, long v public void markMeter(MetricT metric, @Nullable String profileName, long amount) { if (isEnabled(metric, profileName)) { // There is no meter type in Micrometer, so use a counter - getOrCreateCounterFor(metric).increment(amount); + getOrCreateCounterFor(metric).increment((double) amount); } } diff --git a/osgi-tests/pom.xml b/osgi-tests/pom.xml index e776519ec6d..0067d5a009e 100644 --- a/osgi-tests/pom.xml +++ b/osgi-tests/pom.xml @@ -165,6 +165,23 @@ + + maven-compiler-plugin + + + + com.scylladb + java-driver-mapper-processor + ${project.version} + + + com.scylladb + java-driver-mapper-runtime + ${project.version} + + + + org.apache.servicemix.tooling depends-maven-plugin diff --git a/test-infra/pom.xml b/test-infra/pom.xml index b6821c0ccf0..ceb4f14ac3b 100644 --- a/test-infra/pom.xml +++ b/test-infra/pom.xml @@ -48,6 +48,11 @@ com.scylladb java-driver-core + + org.apache.tinkerpop + gremlin-core + provided + com.github.spotbugs spotbugs-annotations diff --git a/test-infra/src/main/java/com/datastax/oss/driver/internal/gremlin/PatchedGremlinDslProcessor.java b/test-infra/src/main/java/com/datastax/oss/driver/internal/gremlin/PatchedGremlinDslProcessor.java new file mode 100644 index 00000000000..e8639b2d396 --- /dev/null +++ b/test-infra/src/main/java/com/datastax/oss/driver/internal/gremlin/PatchedGremlinDslProcessor.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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.datastax.oss.driver.internal.gremlin; + +import java.util.Collections; +import java.util.Set; +import javax.annotation.processing.SupportedAnnotationTypes; +import javax.lang.model.SourceVersion; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDslProcessor; + +@SupportedAnnotationTypes("org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl") +public class PatchedGremlinDslProcessor extends GremlinDslProcessor { + + @Override + public Set getSupportedAnnotationTypes() { + return Collections.singleton("org.apache.tinkerpop.gremlin.process.traversal.dsl.GremlinDsl"); + } + + @Override + public SourceVersion getSupportedSourceVersion() { + return SourceVersion.latestSupported(); + } +} From d9ac0681bc5d68f3863f4875b8169bd0cd601dd1 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Tue, 26 May 2026 00:04:50 -0400 Subject: [PATCH 7/7] refactor: hide mutable primitive codec array Keep PRIMITIVE_CODECS public for source and binary compatibility, deprecate direct array access, and add getPrimitiveCodecs() as the immutable-list accessor. Refs #908 --- .../codec/registry/CodecRegistryConstants.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/registry/CodecRegistryConstants.java b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/registry/CodecRegistryConstants.java index bbf77bdf5dc..01f7156a4c9 100644 --- a/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/registry/CodecRegistryConstants.java +++ b/core/src/main/java/com/datastax/oss/driver/internal/core/type/codec/registry/CodecRegistryConstants.java @@ -19,6 +19,7 @@ import com.datastax.oss.driver.api.core.type.codec.TypeCodec; import com.datastax.oss.driver.api.core.type.codec.TypeCodecs; +import java.util.List; import java.util.function.BiConsumer; import java.util.function.BiFunction; @@ -31,7 +32,12 @@ public class CodecRegistryConstants { *

    This is exposed in case you want to call {@link * DefaultCodecRegistry#DefaultCodecRegistry(String, int, BiFunction, int, BiConsumer, * TypeCodec[])} but only customize the caching options. + * + * @deprecated use {@link #getPrimitiveCodecs()} instead. This array remains public for binary + * compatibility and will be made non-public in a future release. */ + @Deprecated + @SuppressWarnings("MutablePublicArray") public static final TypeCodec[] PRIMITIVE_CODECS = new TypeCodec[] { // Must be declared before AsciiCodec so it gets chosen when CQL type not available @@ -57,4 +63,12 @@ public class CodecRegistryConstants { TypeCodecs.COUNTER, TypeCodecs.ASCII }; + + /** + * Returns the driver's default primitive codecs (map all primitive CQL types to their "natural" + * Java equivalent). + */ + public static List> getPrimitiveCodecs() { + return List.of(PRIMITIVE_CODECS); + } }

  • Examples
    Create statementCase-sensitive?CQL idInternal id
    CREATE TABLE t(foo int PRIMARY KEY)Nofoofoo
    CREATE TABLE t(Foo int PRIMARY KEY)Nofoofoo