diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java index cf4f87aa89b..0a10ca472c2 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraHealthContributorAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package org.springframework.boot.actuate.autoconfigure.cassandra; import java.util.Map; -import com.datastax.driver.core.Cluster; +import com.datastax.oss.driver.api.core.CqlSession; import org.springframework.boot.actuate.autoconfigure.health.CompositeHealthContributorConfiguration; import org.springframework.boot.actuate.autoconfigure.health.ConditionalOnEnabledHealthIndicator; @@ -44,7 +44,7 @@ import org.springframework.data.cassandra.core.CassandraOperations; * @since 2.1.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Cluster.class, CassandraOperations.class }) +@ConditionalOnClass({ CqlSession.class, CassandraOperations.class }) @ConditionalOnBean(CassandraOperations.class) @ConditionalOnEnabledHealthIndicator("cassandra") @AutoConfigureAfter({ CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class, diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java index 45ba39a5b0e..fbe71367b8f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cassandra/CassandraReactiveHealthContributorAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package org.springframework.boot.actuate.autoconfigure.cassandra; import java.util.Map; -import com.datastax.driver.core.Cluster; +import com.datastax.oss.driver.api.core.CqlSession; import reactor.core.publisher.Flux; import org.springframework.boot.actuate.autoconfigure.health.CompositeReactiveHealthContributorConfiguration; @@ -43,7 +43,7 @@ import org.springframework.data.cassandra.core.ReactiveCassandraOperations; * @since 2.1.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Cluster.class, ReactiveCassandraOperations.class, Flux.class }) +@ConditionalOnClass({ CqlSession.class, ReactiveCassandraOperations.class, Flux.class }) @ConditionalOnBean(ReactiveCassandraOperations.class) @ConditionalOnEnabledHealthIndicator("cassandra") @AutoConfigureAfter(CassandraReactiveDataAutoConfiguration.class) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java index bcaaae1bd86..9b57d2eec9f 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,8 @@ package org.springframework.boot.actuate.cassandra; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; @@ -53,9 +52,9 @@ public class CassandraHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - Select select = QueryBuilder.select("release_version").from("system", "local"); + SimpleStatement select = SimpleStatement.newInstance("SELECT release_version FROM system.local"); ResultSet results = this.cassandraOperations.getCqlOperations().queryForResultSet(select); - if (results.isExhausted()) { + if (results.isFullyFetched()) { builder.up(); return; } diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicator.java index 845f2869866..2def3083a4d 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,7 @@ */ package org.springframework.boot.actuate.cassandra; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; import reactor.core.publisher.Mono; import org.springframework.boot.actuate.health.AbstractReactiveHealthIndicator; @@ -47,7 +46,7 @@ public class CassandraReactiveHealthIndicator extends AbstractReactiveHealthIndi @Override protected Mono doHealthCheck(Health.Builder builder) { - Select select = QueryBuilder.select("release_version").from("system", "local"); + SimpleStatement select = SimpleStatement.newInstance("SELECT release_version FROM system.local"); return this.reactiveCassandraOperations.getReactiveCqlOperations().queryForObject(select, String.class) .map((version) -> builder.up().withDetail("version", version).build()).single(); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java index 61889d385a6..ed6d84588af 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,9 @@ package org.springframework.boot.actuate.cassandra; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; import org.junit.jupiter.api.Test; import org.springframework.boot.actuate.health.Health; @@ -51,8 +51,8 @@ class CassandraHealthIndicatorTests { ResultSet resultSet = mock(ResultSet.class); CassandraHealthIndicator healthIndicator = new CassandraHealthIndicator(cassandraOperations); given(cassandraOperations.getCqlOperations()).willReturn(cqlOperations); - given(cqlOperations.queryForResultSet(any(Select.class))).willReturn(resultSet); - given(resultSet.isExhausted()).willReturn(true); + given(cqlOperations.queryForResultSet(any(SimpleStatement.class))).willReturn(resultSet); + given(resultSet.isFullyFetched()).willReturn(true); Health health = healthIndicator.health(); assertThat(health.getStatus()).isEqualTo(Status.UP); } @@ -65,8 +65,8 @@ class CassandraHealthIndicatorTests { Row row = mock(Row.class); CassandraHealthIndicator healthIndicator = new CassandraHealthIndicator(cassandraOperations); given(cassandraOperations.getCqlOperations()).willReturn(cqlOperations); - given(cqlOperations.queryForResultSet(any(Select.class))).willReturn(resultSet); - given(resultSet.isExhausted()).willReturn(false); + given(cqlOperations.queryForResultSet(any(SimpleStatement.class))).willReturn(resultSet); + given(resultSet.isFullyFetched()).willReturn(false); given(resultSet.one()).willReturn(row); String expectedVersion = "1.0.0"; given(row.getString(0)).willReturn(expectedVersion); diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicatorTests.java index a480f644310..b795e3d783b 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicatorTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraReactiveHealthIndicatorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package org.springframework.boot.actuate.cassandra; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.oss.driver.api.core.cql.SimpleStatement; import org.junit.jupiter.api.Test; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -42,7 +42,8 @@ class CassandraReactiveHealthIndicatorTests { @Test void testCassandraIsUp() { ReactiveCqlOperations reactiveCqlOperations = mock(ReactiveCqlOperations.class); - given(reactiveCqlOperations.queryForObject(any(Select.class), eq(String.class))).willReturn(Mono.just("6.0.0")); + given(reactiveCqlOperations.queryForObject(any(SimpleStatement.class), eq(String.class))) + .willReturn(Mono.just("6.0.0")); ReactiveCassandraOperations reactiveCassandraOperations = mock(ReactiveCassandraOperations.class); given(reactiveCassandraOperations.getReactiveCqlOperations()).willReturn(reactiveCqlOperations); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java index d5361b55767..6334683ee88 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,12 +16,24 @@ package org.springframework.boot.autoconfigure.cassandra; +import java.security.NoSuchAlgorithmException; import java.time.Duration; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.PoolingOptions; -import com.datastax.driver.core.QueryOptions; -import com.datastax.driver.core.SocketOptions; +import javax.net.ssl.SSLContext; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.config.DriverOption; +import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; +import com.datastax.oss.driver.internal.core.config.typesafe.DefaultDriverConfigLoader; +import com.datastax.oss.driver.internal.core.config.typesafe.DefaultProgrammaticDriverConfigLoaderBuilder; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigFactory; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -31,7 +43,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; +import org.springframework.context.annotation.Lazy; /** * {@link EnableAutoConfiguration Auto-configuration} for Cassandra. @@ -44,64 +56,131 @@ import org.springframework.util.StringUtils; * @since 1.3.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Cluster.class }) +@ConditionalOnClass({ CqlSession.class }) @EnableConfigurationProperties(CassandraProperties.class) public class CassandraAutoConfiguration { @Bean @ConditionalOnMissingBean - public Cluster cassandraCluster(CassandraProperties properties, - ObjectProvider builderCustomizers, - ObjectProvider clusterFactory) { - PropertyMapper map = PropertyMapper.get(); - Cluster.Builder builder = Cluster.builder().withClusterName(properties.getClusterName()) - .withPort(properties.getPort()); - map.from(properties::getUsername).whenNonNull() - .to((username) -> builder.withCredentials(username, properties.getPassword())); - map.from(properties::getCompression).whenNonNull().to(builder::withCompression); - QueryOptions queryOptions = getQueryOptions(properties); - map.from(queryOptions).to(builder::withQueryOptions); - SocketOptions socketOptions = getSocketOptions(properties); - map.from(socketOptions).to(builder::withSocketOptions); - map.from(properties::isSsl).whenTrue().toCall(builder::withSSL); - PoolingOptions poolingOptions = getPoolingOptions(properties); - map.from(poolingOptions).to(builder::withPoolingOptions); - map.from(properties::getContactPoints).as(StringUtils::toStringArray).to(builder::addContactPoints); - map.from(properties::isJmxEnabled).whenFalse().toCall(builder::withoutJMXReporting); + @Lazy + public CqlSession cqlSession(CqlSessionBuilder cqlSessionBuilder) { + return cqlSessionBuilder.build(); + } + + @Bean + @ConditionalOnMissingBean + public CqlSessionBuilder cqlSessionBuilder(CassandraProperties properties, DriverConfigLoader driverConfigLoader, + ObjectProvider builderCustomizers) { + CqlSessionBuilder builder = CqlSession.builder().withConfigLoader(driverConfigLoader); + configureSsl(properties, builder); + builder.withKeyspace(properties.getKeyspaceName()); builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder)); - return clusterFactory.getIfAvailable(() -> Cluster::buildFrom).create(builder); + return builder; } - private QueryOptions getQueryOptions(CassandraProperties properties) { - PropertyMapper map = PropertyMapper.get(); - QueryOptions options = new QueryOptions(); - map.from(properties::getConsistencyLevel).whenNonNull().to(options::setConsistencyLevel); - map.from(properties::getSerialConsistencyLevel).whenNonNull().to(options::setSerialConsistencyLevel); - map.from(properties::getFetchSize).to(options::setFetchSize); - return options; + private void configureSsl(CassandraProperties properties, CqlSessionBuilder builder) { + if (properties.isSsl()) { + try { + builder.withSslContext(SSLContext.getDefault()); + } + catch (NoSuchAlgorithmException ex) { + throw new IllegalStateException("Could not setup SSL default context for Cassandra", ex); + } + } } - private SocketOptions getSocketOptions(CassandraProperties properties) { + @Bean + @ConditionalOnMissingBean + public DriverConfigLoader driverConfigLoader(CassandraProperties properties, + ObjectProvider builderCustomizers) { + ProgrammaticDriverConfigLoaderBuilder builder = new DefaultProgrammaticDriverConfigLoaderBuilder( + () -> cassandraConfiguration(properties), DefaultDriverConfigLoader.DEFAULT_ROOT_PATH); + builderCustomizers.orderedStream().forEach((customizer) -> customizer.customizer(builder)); + return builder.build(); + } + + private Config cassandraConfiguration(CassandraProperties properties) { + CassandraDriverOptions options = new CassandraDriverOptions(); + PropertyMapper map = PropertyMapper.get(); + map.from(properties.getSessionName()).whenHasText() + .to((sessionName) -> options.add(DefaultDriverOption.SESSION_NAME, sessionName)); + map.from(properties::getUsername).whenNonNull() + .to((username) -> options.add(DefaultDriverOption.AUTH_PROVIDER_USER_NAME, username) + .add(DefaultDriverOption.AUTH_PROVIDER_PASSWORD, properties.getPassword())); + map.from(properties::getCompression).whenNonNull() + .to((compression) -> options.add(DefaultDriverOption.PROTOCOL_COMPRESSION, compression)); + mapQueryOptions(properties, options); + mapSocketOptions(properties, options); + mapPoolingOptions(properties, options); + map.from(properties::getContactPoints) + .to((contactPoints) -> options.add(DefaultDriverOption.CONTACT_POINTS, contactPoints)); + ConfigFactory.invalidateCaches(); + return ConfigFactory.defaultOverrides().withFallback(options.build()) + .withFallback(ConfigFactory.defaultReference()).resolve(); + } + + private void mapQueryOptions(CassandraProperties properties, CassandraDriverOptions options) { + PropertyMapper map = PropertyMapper.get(); + map.from(properties::getConsistencyLevel).whenNonNull() + .to(((consistency) -> options.add(DefaultDriverOption.REQUEST_CONSISTENCY, consistency))); + map.from(properties::getSerialConsistencyLevel).whenNonNull().to( + (serialConsistency) -> options.add(DefaultDriverOption.REQUEST_SERIAL_CONSISTENCY, serialConsistency)); + map.from(properties::getPageSize) + .to((pageSize) -> options.add(DefaultDriverOption.REQUEST_PAGE_SIZE, pageSize)); + } + + private void mapSocketOptions(CassandraProperties properties, CassandraDriverOptions options) { PropertyMapper map = PropertyMapper.get(); - SocketOptions options = new SocketOptions(); map.from(properties::getConnectTimeout).whenNonNull().asInt(Duration::toMillis) - .to(options::setConnectTimeoutMillis); - map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis).to(options::setReadTimeoutMillis); - return options; + .to((connectTimeout) -> options.add(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT, connectTimeout)); + map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis) + .to((readTimeout) -> options.add(DefaultDriverOption.REQUEST_TIMEOUT, readTimeout)); } - private PoolingOptions getPoolingOptions(CassandraProperties properties) { + private void mapPoolingOptions(CassandraProperties properties, CassandraDriverOptions options) { PropertyMapper map = PropertyMapper.get(); CassandraProperties.Pool poolProperties = properties.getPool(); - PoolingOptions options = new PoolingOptions(); map.from(poolProperties::getIdleTimeout).whenNonNull().asInt(Duration::getSeconds) - .to(options::setIdleTimeoutSeconds); - map.from(poolProperties::getPoolTimeout).whenNonNull().asInt(Duration::toMillis) - .to(options::setPoolTimeoutMillis); + .to((idleTimeout) -> options.add(DefaultDriverOption.HEARTBEAT_TIMEOUT, idleTimeout)); map.from(poolProperties::getHeartbeatInterval).whenNonNull().asInt(Duration::getSeconds) - .to(options::setHeartbeatIntervalSeconds); - map.from(poolProperties::getMaxQueueSize).to(options::setMaxQueueSize); - return options; + .to((heartBeatInterval) -> options.add(DefaultDriverOption.HEARTBEAT_INTERVAL, heartBeatInterval)); + map.from(poolProperties::getMaxQueueSize) + .to((maxQueueSize) -> options.add(DefaultDriverOption.REQUEST_THROTTLER_MAX_QUEUE_SIZE, maxQueueSize)); + } + + private static class CassandraDriverOptions { + + private final Map options = new LinkedHashMap<>(); + + private CassandraDriverOptions add(DriverOption option, String value) { + String key = createKeyFor(option); + this.options.put(key, value); + return this; + } + + private CassandraDriverOptions add(DriverOption option, int value) { + return add(option, String.valueOf(value)); + } + + private CassandraDriverOptions add(DriverOption option, Enum value) { + return add(option, value.name()); + } + + private CassandraDriverOptions add(DriverOption option, List values) { + for (int i = 0; i < values.size(); i++) { + this.options.put(String.format("%s.%s", createKeyFor(option), i), values.get(i)); + } + return this; + } + + private Config build() { + return ConfigFactory.parseMap(this.options, "Environment"); + } + + private static String createKeyFor(DriverOption option) { + return String.format("%s.%s", DefaultDriverConfigLoader.DEFAULT_ROOT_PATH, option.getPath()); + } + } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java index 47d5cdef637..1214ebbee13 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,12 +22,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import com.datastax.driver.core.ConsistencyLevel; -import com.datastax.driver.core.ProtocolOptions; -import com.datastax.driver.core.ProtocolOptions.Compression; -import com.datastax.driver.core.QueryOptions; +import com.datastax.oss.driver.api.core.DefaultConsistencyLevel; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.DeprecatedConfigurationProperty; import org.springframework.boot.convert.DurationUnit; /** @@ -48,19 +46,14 @@ public class CassandraProperties { private String keyspaceName; /** - * Name of the Cassandra cluster. + * Name of the Cassandra session. */ - private String clusterName; + private String sessionName; /** - * Cluster node addresses. + * Cluster node addresses in the form 'host:port'. */ - private final List contactPoints = new ArrayList<>(Collections.singleton("localhost")); - - /** - * Port of the Cassandra server. - */ - private int port = ProtocolOptions.DEFAULT_PORT; + private final List contactPoints = new ArrayList<>(Collections.singleton("127.0.0.1:9042")); /** * Login user of the server. @@ -80,17 +73,17 @@ public class CassandraProperties { /** * Queries consistency level. */ - private ConsistencyLevel consistencyLevel; + private DefaultConsistencyLevel consistencyLevel; /** * Queries serial consistency level. */ - private ConsistencyLevel serialConsistencyLevel; + private DefaultConsistencyLevel serialConsistencyLevel; /** - * Queries default fetch size. + * Queries default page size. */ - private int fetchSize = QueryOptions.DEFAULT_FETCH_SIZE; + private int pageSize = 5000; /** * Socket option: connection time out. @@ -112,12 +105,6 @@ public class CassandraProperties { */ private boolean ssl = false; - /** - * Whether to enable JMX reporting. Default to false as Cassandra JMX reporting is not - * compatible with Dropwizard Metrics. - */ - private boolean jmxEnabled; - /** * Pool configuration. */ @@ -131,26 +118,29 @@ public class CassandraProperties { this.keyspaceName = keyspaceName; } - public String getClusterName() { - return this.clusterName; + public String getSessionName() { + return this.sessionName; } + public void setSessionName(String sessionName) { + this.sessionName = sessionName; + } + + @Deprecated + @DeprecatedConfigurationProperty(replacement = "spring.data.cassandra.session-name") + public String getClusterName() { + return getSessionName(); + } + + @Deprecated public void setClusterName(String clusterName) { - this.clusterName = clusterName; + setSessionName(clusterName); } public List getContactPoints() { return this.contactPoints; } - public int getPort() { - return this.port; - } - - public void setPort(int port) { - this.port = port; - } - public String getUsername() { return this.username; } @@ -175,28 +165,39 @@ public class CassandraProperties { this.compression = compression; } - public ConsistencyLevel getConsistencyLevel() { + public DefaultConsistencyLevel getConsistencyLevel() { return this.consistencyLevel; } - public void setConsistencyLevel(ConsistencyLevel consistency) { + public void setConsistencyLevel(DefaultConsistencyLevel consistency) { this.consistencyLevel = consistency; } - public ConsistencyLevel getSerialConsistencyLevel() { + public DefaultConsistencyLevel getSerialConsistencyLevel() { return this.serialConsistencyLevel; } - public void setSerialConsistencyLevel(ConsistencyLevel serialConsistency) { + public void setSerialConsistencyLevel(DefaultConsistencyLevel serialConsistency) { this.serialConsistencyLevel = serialConsistency; } - public int getFetchSize() { - return this.fetchSize; + public int getPageSize() { + return this.pageSize; } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + @Deprecated + @DeprecatedConfigurationProperty(replacement = "spring.data.cassandra.page-size") + public int getFetchSize() { + return getPageSize(); + } + + @Deprecated public void setFetchSize(int fetchSize) { - this.fetchSize = fetchSize; + setPageSize(fetchSize); } public Duration getConnectTimeout() { @@ -223,14 +224,6 @@ public class CassandraProperties { this.ssl = ssl; } - public boolean isJmxEnabled() { - return this.jmxEnabled; - } - - public void setJmxEnabled(boolean jmxEnabled) { - this.jmxEnabled = jmxEnabled; - } - public String getSchemaAction() { return this.schemaAction; } @@ -255,11 +248,6 @@ public class CassandraProperties { @DurationUnit(ChronoUnit.SECONDS) private Duration idleTimeout = Duration.ofSeconds(120); - /** - * Pool timeout when trying to acquire a connection from a host's pool. - */ - private Duration poolTimeout = Duration.ofMillis(5000); - /** * Heartbeat interval after which a message is sent on an idle connection to make * sure it's still alive. If a duration suffix is not specified, seconds will be @@ -281,14 +269,6 @@ public class CassandraProperties { this.idleTimeout = idleTimeout; } - public Duration getPoolTimeout() { - return this.poolTimeout; - } - - public void setPoolTimeout(Duration poolTimeout) { - this.poolTimeout = poolTimeout; - } - public Duration getHeartbeatInterval() { return this.heartbeatInterval; } @@ -307,4 +287,26 @@ public class CassandraProperties { } + /** + * Name of the algorithm used to compress protocol frames. + */ + public enum Compression { + + /** + * Requires 'net.jpountz.lz4:lz4'. + */ + LZ4, + + /** + * Requires org.xerial.snappy:snappy-java. + */ + SNAPPY, + + /** + * No compression. + */ + NONE; + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterFactory.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterFactory.java deleted file mode 100644 index 83dcb773ffc..00000000000 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterFactory.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.boot.autoconfigure.cassandra; - -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Cluster.Initializer; - -/** - * {@code ClusterFactory} provides control over the creation of a {@link Cluster} from an - * {@link Initializer}. - * - * @author Steffen F. Qvistgaard - * @since 2.2.0 - */ -@FunctionalInterface -public interface ClusterFactory { - - /** - * Creates a {@link Cluster} from the given {@link Initializer}. - * @param initializer the {@code Initializer} - * @return the {@code Cluster} - */ - Cluster create(Initializer initializer); - -} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterBuilderCustomizer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CqlSessionBuilderCustomizer.java similarity index 61% rename from spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterBuilderCustomizer.java rename to spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CqlSessionBuilderCustomizer.java index 10ebf2df597..70d48f50314 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/ClusterBuilderCustomizer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CqlSessionBuilderCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,24 +16,24 @@ package org.springframework.boot.autoconfigure.cassandra; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Cluster.Builder; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; /** * Callback interface that can be implemented by beans wishing to customize the - * {@link Cluster} via a {@link Builder Cluster.Builder} whilst retaining default + * {@link CqlSession} via a {@link CqlSessionBuilder} whilst retaining default * auto-configuration. * - * @author EddĂș MelĂ©ndez - * @since 1.5.0 + * @author Stephane Nicoll + * @since 2.3.0 */ @FunctionalInterface -public interface ClusterBuilderCustomizer { +public interface CqlSessionBuilderCustomizer { /** - * Customize the {@link Builder}. - * @param clusterBuilder the builder to customize + * Customize the {@link CqlSessionBuilder}. + * @param cqlSessionBuilder the builder to customize */ - void customize(Builder clusterBuilder); + void customize(CqlSessionBuilder cqlSessionBuilder); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/DriverConfigLoaderBuilderCustomizer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/DriverConfigLoaderBuilderCustomizer.java new file mode 100644 index 00000000000..493d232e667 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/DriverConfigLoaderBuilderCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.cassandra; + +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; + +/** + * Callback interface that can be implemented by beans wishing to customize the + * {@link DriverConfigLoader} via a {@link DriverConfigLoaderBuilderCustomizer} whilst + * retaining default auto-configuration. + * + * @author Stephane Nicoll + * @since 2.3.0 + */ +public interface DriverConfigLoaderBuilderCustomizer { + + /** + * Customize the {@linkplain ProgrammaticDriverConfigLoaderBuilder DriverConfigLoader + * builder}. + * @param builder the builder to customize + */ + void customizer(ProgrammaticDriverConfigLoaderBuilder builder); + +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java index 309da94409c..8f29bd9143f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,28 +19,25 @@ package org.springframework.boot.autoconfigure.data.cassandra; import java.util.Collections; import java.util.List; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.springframework.beans.factory.BeanFactory; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; -import org.springframework.boot.autoconfigure.cassandra.CassandraProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.domain.EntityScanPackages; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.context.properties.PropertyMapper; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import org.springframework.data.cassandra.SessionFactory; import org.springframework.data.cassandra.config.CassandraEntityClassScanner; -import org.springframework.data.cassandra.config.CassandraSessionFactoryBean; import org.springframework.data.cassandra.config.SchemaAction; +import org.springframework.data.cassandra.config.SessionFactoryFactoryBean; import org.springframework.data.cassandra.core.CassandraAdminOperations; import org.springframework.data.cassandra.core.CassandraOperations; import org.springframework.data.cassandra.core.CassandraTemplate; @@ -60,19 +57,15 @@ import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver; * @since 1.3.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Cluster.class, CassandraAdminOperations.class }) -@ConditionalOnBean(Cluster.class) -@EnableConfigurationProperties(CassandraProperties.class) +@ConditionalOnClass({ CqlSession.class, CassandraAdminOperations.class }) +@ConditionalOnBean(CqlSession.class) @AutoConfigureAfter(CassandraAutoConfiguration.class) public class CassandraDataAutoConfiguration { - private final CassandraProperties properties; + private final CqlSession session; - private final Cluster cluster; - - public CassandraDataAutoConfiguration(CassandraProperties properties, Cluster cluster) { - this.properties = properties; - this.cluster = cluster; + public CassandraDataAutoConfiguration(CqlSession session) { + this.session = session; } @Bean @@ -87,16 +80,11 @@ public class CassandraDataAutoConfiguration { if (!packages.isEmpty()) { context.setInitialEntitySet(CassandraEntityClassScanner.scan(packages)); } - PropertyMapper.get().from(this.properties::getKeyspaceName).whenHasText().as(this::createSimpleUserTypeResolver) - .to(context::setUserTypeResolver); + context.setUserTypeResolver(new SimpleUserTypeResolver(this.session)); context.setCustomConversions(conversions); return context; } - private SimpleUserTypeResolver createSimpleUserTypeResolver(String keyspaceName) { - return new SimpleUserTypeResolver(this.cluster, keyspaceName); - } - @Bean @ConditionalOnMissingBean public CassandraConverter cassandraConverter(CassandraMappingContext mapping, @@ -107,12 +95,11 @@ public class CassandraDataAutoConfiguration { } @Bean - @ConditionalOnMissingBean(Session.class) - public CassandraSessionFactoryBean cassandraSession(Environment environment, CassandraConverter converter) { - CassandraSessionFactoryBean session = new CassandraSessionFactoryBean(); - session.setCluster(this.cluster); + @ConditionalOnMissingBean(SessionFactory.class) + public SessionFactoryFactoryBean cassandraSession(Environment environment, CassandraConverter converter) { + SessionFactoryFactoryBean session = new SessionFactoryFactoryBean(); + session.setSession(this.session); session.setConverter(converter); - session.setKeyspaceName(this.properties.getKeyspaceName()); Binder binder = Binder.get(environment); binder.bind("spring.data.cassandra.schema-action", SchemaAction.class).ifBound(session::setSchemaAction); return session; @@ -120,8 +107,8 @@ public class CassandraDataAutoConfiguration { @Bean @ConditionalOnMissingBean(CassandraOperations.class) - public CassandraTemplate cassandraTemplate(Session session, CassandraConverter converter) { - return new CassandraTemplate(session, converter); + public CassandraTemplate cassandraTemplate(SessionFactory sessionFactory, CassandraConverter converter) { + return new CassandraTemplate(sessionFactory, converter); } @Bean diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfiguration.java index 2f0cd835894..2d173e2bcb0 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,7 @@ package org.springframework.boot.autoconfigure.data.cassandra; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import reactor.core.publisher.Flux; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -44,14 +43,14 @@ import org.springframework.data.cassandra.core.cql.session.DefaultReactiveSessio * @since 2.0.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Cluster.class, ReactiveCassandraTemplate.class, Flux.class }) -@ConditionalOnBean(Session.class) +@ConditionalOnClass({ CqlSession.class, ReactiveCassandraTemplate.class, Flux.class }) +@ConditionalOnBean(CqlSession.class) @AutoConfigureAfter(CassandraDataAutoConfiguration.class) public class CassandraReactiveDataAutoConfiguration { @Bean @ConditionalOnMissingBean - public ReactiveSession reactiveCassandraSession(Session session) { + public ReactiveSession reactiveCassandraSession(CqlSession session) { return new DefaultBridgedReactiveSession(session); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfiguration.java index 0f717f77ddd..0f655e88c65 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ package org.springframework.boot.autoconfigure.data.cassandra; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -38,7 +38,7 @@ import org.springframework.data.cassandra.repository.support.CassandraRepository * @since 1.3.0 */ @Configuration(proxyBeanMethods = false) -@ConditionalOnClass({ Session.class, CassandraRepository.class }) +@ConditionalOnClass({ CqlSession.class, CassandraRepository.class }) @ConditionalOnRepositoryType(store = "cassandra", type = RepositoryType.IMPERATIVE) @ConditionalOnMissingBean(CassandraRepositoryFactoryBean.class) @Import(CassandraRepositoriesRegistrar.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration.java index 91f2e841118..653796e03e5 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,15 +27,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.reactive.ReactiveElasticsearchClient; -import org.springframework.data.elasticsearch.core.DefaultEntityMapper; -import org.springframework.data.elasticsearch.core.DefaultResultMapper; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.EntityMapper; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.ResultsMapper; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; @@ -48,6 +44,7 @@ import org.springframework.web.reactive.function.client.WebClient; * their order of execution. * * @author Brian Clozel + * @author Scott Frederick */ abstract class ElasticsearchDataConfiguration { @@ -66,18 +63,6 @@ abstract class ElasticsearchDataConfiguration { return new SimpleElasticsearchMappingContext(); } - @Bean - @ConditionalOnMissingBean - EntityMapper entityMapper(SimpleElasticsearchMappingContext mappingContext) { - return new DefaultEntityMapper(mappingContext); - } - - @Bean - @ConditionalOnMissingBean - ResultsMapper resultsMapper(SimpleElasticsearchMappingContext mappingContext, EntityMapper entityMapper) { - return new DefaultResultMapper(mappingContext, entityMapper); - } - } @Configuration(proxyBeanMethods = false) @@ -87,9 +72,8 @@ abstract class ElasticsearchDataConfiguration { @Bean @ConditionalOnMissingBean(value = ElasticsearchOperations.class, name = "elasticsearchTemplate") @ConditionalOnBean(RestHighLevelClient.class) - ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter, - ResultsMapper resultsMapper) { - return new ElasticsearchRestTemplate(client, converter, resultsMapper); + ElasticsearchRestTemplate elasticsearchTemplate(RestHighLevelClient client, ElasticsearchConverter converter) { + return new ElasticsearchRestTemplate(client, converter); } } @@ -101,10 +85,10 @@ abstract class ElasticsearchDataConfiguration { @Bean @ConditionalOnMissingBean(value = ElasticsearchOperations.class, name = "elasticsearchTemplate") @ConditionalOnBean(Client.class) - ElasticsearchTemplate elasticsearchTemplate(Client client, ElasticsearchConverter converter, - ResultsMapper resultsMapper) { + @Deprecated + ElasticsearchTemplate elasticsearchTemplate(Client client, ElasticsearchConverter converter) { try { - return new ElasticsearchTemplate(client, converter, resultsMapper); + return new ElasticsearchTemplate(client, converter); } catch (Exception ex) { throw new IllegalStateException(ex); @@ -121,9 +105,8 @@ abstract class ElasticsearchDataConfiguration { @ConditionalOnMissingBean(value = ReactiveElasticsearchOperations.class, name = "reactiveElasticsearchTemplate") @ConditionalOnBean(ReactiveElasticsearchClient.class) ReactiveElasticsearchTemplate reactiveElasticsearchTemplate(ReactiveElasticsearchClient client, - ElasticsearchConverter converter, ResultsMapper resultsMapper) { - ReactiveElasticsearchTemplate template = new ReactiveElasticsearchTemplate(client, converter, - resultsMapper); + ElasticsearchConverter converter) { + ReactiveElasticsearchTemplate template = new ReactiveElasticsearchTemplate(client, converter); template.setIndicesOptions(IndicesOptions.strictExpandOpenAndForbidClosed()); template.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE); return template; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 635da717b8f..8fd7acca3f6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1557,6 +1557,33 @@ "level": "error" } }, + { + "name": "spring.data.cassandra.jmx-enabled", + "type": "java.lang.Boolean", + "description": "Whether to enable JMX reporting. Default to false as Cassandra JMX reporting is not compatible with Dropwizard Metrics.", + "deprecation": { + "reason": "Cassandra no longer providers JMX metrics.", + "level": "error" + } + }, + { + "name": "spring.data.cassandra.pool.pool-timeout", + "type": "java.time.Duration", + "description": "Pool timeout when trying to acquire a connection from a host's pool.", + "deprecation": { + "reason": "No longer available.", + "level": "error" + } + }, + { + "name": "spring.data.cassandra.port", + "type": "java.lang.Integer", + "description": "Port of the Cassandra server.", + "deprecation": { + "reason": "each contact point must be of the form 'host:port'.", + "level": "error" + } + }, { "name": "spring.data.cassandra.read-timeout-millis", "type": "java.lang.Integer", diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java index f2d9362ffe3..9a139ab28da 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,12 @@ package org.springframework.boot.autoconfigure.cassandra; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Cluster.Initializer; -import com.datastax.driver.core.PoolingOptions; +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.config.DriverExecutionProfile; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigParseOptions; +import com.typesafe.config.impl.Parseable; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -27,7 +30,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; /** * Tests for {@link CassandraAutoConfiguration} @@ -41,110 +43,66 @@ class CassandraAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(CassandraAutoConfiguration.class)); @Test - void createClusterWithDefault() { + void driverConfigLoaderWithDefaultConfiguration() { this.contextRunner.run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - assertThat(context.getBean(Cluster.class).getClusterName()).startsWith("cluster"); + assertThat(context).hasSingleBean(DriverConfigLoader.class); + assertThat(context.getBean(DriverConfigLoader.class).getInitialConfig().getDefaultProfile() + .isDefined(DefaultDriverOption.SESSION_NAME)).isFalse(); }); } @Test - void createClusterWithOverrides() { - this.contextRunner.withPropertyValues("spring.data.cassandra.cluster-name=testcluster").run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - assertThat(context.getBean(Cluster.class).getClusterName()).isEqualTo("testcluster"); + void driverConfigLoaderWithCustomSessionName() { + this.contextRunner.withPropertyValues("spring.data.cassandra.session-name=testcluster").run((context) -> { + assertThat(context).hasSingleBean(DriverConfigLoader.class); + assertThat(context.getBean(DriverConfigLoader.class).getInitialConfig().getDefaultProfile() + .getString(DefaultDriverOption.SESSION_NAME)).isEqualTo("testcluster"); }); } @Test - void createCustomizeCluster() { - this.contextRunner.withUserConfiguration(MockCustomizerConfig.class).run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - assertThat(context).hasSingleBean(ClusterBuilderCustomizer.class); - }); - } - - @Test - void customizerOverridesAutoConfig() { - this.contextRunner.withUserConfiguration(SimpleCustomizerConfig.class) - .withPropertyValues("spring.data.cassandra.cluster-name=testcluster").run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - assertThat(context.getBean(Cluster.class).getClusterName()).isEqualTo("overridden-name"); + void driverConfigLoaderWithCustomSessionNameAndCustomizer() { + this.contextRunner.withUserConfiguration(SimpleDriverConfigLoaderBuilderCustomizerConfig.class) + .withPropertyValues("spring.data.cassandra.session-name=testcluster").run((context) -> { + assertThat(context).hasSingleBean(DriverConfigLoader.class); + assertThat(context.getBean(DriverConfigLoader.class).getInitialConfig().getDefaultProfile() + .getString(DefaultDriverOption.SESSION_NAME)).isEqualTo("overridden-name"); }); } @Test - void defaultPoolOptions() { + void driverConfigLoaderApplyConsistentDefaults() { this.contextRunner.run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - PoolingOptions poolingOptions = context.getBean(Cluster.class).getConfiguration().getPoolingOptions(); - assertThat(poolingOptions.getIdleTimeoutSeconds()).isEqualTo(PoolingOptions.DEFAULT_IDLE_TIMEOUT_SECONDS); - assertThat(poolingOptions.getPoolTimeoutMillis()).isEqualTo(PoolingOptions.DEFAULT_POOL_TIMEOUT_MILLIS); - assertThat(poolingOptions.getHeartbeatIntervalSeconds()) - .isEqualTo(PoolingOptions.DEFAULT_HEARTBEAT_INTERVAL_SECONDS); - assertThat(poolingOptions.getMaxQueueSize()).isEqualTo(PoolingOptions.DEFAULT_MAX_QUEUE_SIZE); + Config defaultConfig = defaultConfig(); + DriverExecutionProfile config = context.getBean(DriverConfigLoader.class).getInitialConfig() + .getDefaultProfile(); + // TODO }); } @Test - void customizePoolOptions() { + void driverConfigLoaderCustomizePoolOptions() { this.contextRunner.withPropertyValues("spring.data.cassandra.pool.idle-timeout=42", - "spring.data.cassandra.pool.pool-timeout=52", "spring.data.cassandra.pool.heartbeat-interval=62", - "spring.data.cassandra.pool.max-queue-size=72").run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); - PoolingOptions poolingOptions = context.getBean(Cluster.class).getConfiguration() - .getPoolingOptions(); - assertThat(poolingOptions.getIdleTimeoutSeconds()).isEqualTo(42); - assertThat(poolingOptions.getPoolTimeoutMillis()).isEqualTo(52); - assertThat(poolingOptions.getHeartbeatIntervalSeconds()).isEqualTo(62); - assertThat(poolingOptions.getMaxQueueSize()).isEqualTo(72); + "spring.data.cassandra.pool.heartbeat-interval=62", "spring.data.cassandra.pool.max-queue-size=72") + .run((context) -> { + DriverExecutionProfile config = context.getBean(DriverConfigLoader.class).getInitialConfig() + .getDefaultProfile(); + assertThat(config.getInt(DefaultDriverOption.HEARTBEAT_TIMEOUT)).isEqualTo(42); + assertThat(config.getInt(DefaultDriverOption.HEARTBEAT_INTERVAL)).isEqualTo(62); + assertThat(config.getInt(DefaultDriverOption.REQUEST_THROTTLER_MAX_QUEUE_SIZE)).isEqualTo(72); }); } - @Test - void clusterFactoryIsCalledToCreateCluster() { - this.contextRunner.withUserConfiguration(ClusterFactoryConfig.class) - .run((context) -> assertThat(context.getBean(TestClusterFactory.class).initializer).isNotNull()); + private static Config defaultConfig() { + return Parseable.newResources("reference.conf", ConfigParseOptions.defaults()).parse().toConfig(); } @Configuration(proxyBeanMethods = false) - static class MockCustomizerConfig { + static class SimpleDriverConfigLoaderBuilderCustomizerConfig { @Bean - ClusterBuilderCustomizer customizer() { - return mock(ClusterBuilderCustomizer.class); - } - - } - - @Configuration(proxyBeanMethods = false) - static class SimpleCustomizerConfig { - - @Bean - ClusterBuilderCustomizer customizer() { - return (clusterBuilder) -> clusterBuilder.withClusterName("overridden-name"); - } - - } - - @Configuration(proxyBeanMethods = false) - static class ClusterFactoryConfig { - - @Bean - TestClusterFactory clusterFactory() { - return new TestClusterFactory(); - } - - } - - static class TestClusterFactory implements ClusterFactory { - - private Initializer initializer = null; - - @Override - public Cluster create(Initializer initializer) { - this.initializer = initializer; - return Cluster.buildFrom(initializer); + DriverConfigLoaderBuilderCustomizer customizer() { + return (builder) -> builder.withString(DefaultDriverOption.SESSION_NAME, "overridden-name"); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java index 00eeaf9e347..ffd637d7f84 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationIntegrationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,10 +16,10 @@ package org.springframework.boot.autoconfigure.data.cassandra; +import java.net.InetSocketAddress; import java.time.Duration; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -29,11 +29,14 @@ import org.testcontainers.junit.jupiter.Testcontainers; import org.springframework.boot.autoconfigure.AutoConfigurationPackages; import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration; +import org.springframework.boot.autoconfigure.cassandra.CqlSessionBuilderCustomizer; import org.springframework.boot.autoconfigure.data.cassandra.city.City; import org.springframework.boot.test.util.TestPropertyValues; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.data.cassandra.config.CassandraSessionFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.data.cassandra.config.SchemaAction; +import org.springframework.data.cassandra.config.SessionFactoryFactoryBean; import static org.assertj.core.api.Assertions.assertThat; @@ -55,8 +58,9 @@ class CassandraDataAutoConfigurationIntegrationTests { @BeforeEach void setUp() { this.context = new AnnotationConfigApplicationContext(); + this.context.register(TestConfiguration.class); TestPropertyValues - .of("spring.data.cassandra.port=" + cassandra.getFirstMappedPort(), + .of("spring.data.cassandra.contact-points:localhost:" + cassandra.getFirstMappedPort(), "spring.data.cassandra.read-timeout=24000", "spring.data.cassandra.connect-timeout=10000") .applyTo(this.context.getEnvironment()); } @@ -74,8 +78,8 @@ class CassandraDataAutoConfigurationIntegrationTests { AutoConfigurationPackages.register(this.context, cityPackage); this.context.register(CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class); this.context.refresh(); - CassandraSessionFactoryBean bean = this.context.getBean(CassandraSessionFactoryBean.class); - assertThat(bean.getSchemaAction()).isEqualTo(SchemaAction.NONE); + assertThat(this.context.getBean(SessionFactoryFactoryBean.class)).hasFieldOrPropertyWithValue("schemaAction", + SchemaAction.NONE); } @Test @@ -87,17 +91,28 @@ class CassandraDataAutoConfigurationIntegrationTests { "spring.data.cassandra.keyspaceName=boot_test").applyTo(this.context); this.context.register(CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class); this.context.refresh(); - CassandraSessionFactoryBean bean = this.context.getBean(CassandraSessionFactoryBean.class); - assertThat(bean.getSchemaAction()).isEqualTo(SchemaAction.RECREATE_DROP_UNUSED); + assertThat(this.context.getBean(SessionFactoryFactoryBean.class)).hasFieldOrPropertyWithValue("schemaAction", + SchemaAction.RECREATE_DROP_UNUSED); } private void createTestKeyspaceIfNotExists() { - Cluster cluster = Cluster.builder().withoutJMXReporting().withPort(cassandra.getFirstMappedPort()) - .addContactPoint(cassandra.getContainerIpAddress()).build(); - try (Session session = cluster.connect()) { + try (CqlSession session = CqlSession.builder() + .addContactPoint( + new InetSocketAddress(cassandra.getContainerIpAddress(), cassandra.getFirstMappedPort())) + .withLocalDatacenter("datacenter1").build()) { session.execute("CREATE KEYSPACE IF NOT EXISTS boot_test" + " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };"); } } + @Configuration + static class TestConfiguration { + + @Bean + CqlSessionBuilderCustomizer sessionCustomizer() { + return (builder) -> builder.withLocalDatacenter("datacenter1"); + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationTests.java index bf590f635a0..47254d9ecc4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationTests.java @@ -19,7 +19,7 @@ package org.springframework.boot.autoconfigure.data.cassandra; import java.util.Collections; import java.util.Set; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -101,7 +101,7 @@ class CassandraDataAutoConfigurationTests { @Test void clusterDoesNotExist() { this.context = new AnnotationConfigApplicationContext(CassandraDataAutoConfiguration.class); - assertThat(this.context.getBeansOfType(Session.class)).isEmpty(); + assertThat(this.context.getBeansOfType(CqlSession.class)).isEmpty(); } void load(Class... config) { @@ -119,8 +119,8 @@ class CassandraDataAutoConfigurationTests { static class TestConfiguration { @Bean - Session getObject() { - return mock(Session.class); + CqlSession cqlSession() { + return mock(CqlSession.class); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfigurationTests.java index bc2032d8591..db0111c7493 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveDataAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package org.springframework.boot.autoconfigure.data.cassandra; import java.util.Set; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; @@ -99,8 +99,8 @@ class CassandraReactiveDataAutoConfigurationTests { static class TestConfiguration { @Bean - Session session() { - return mock(Session.class); + CqlSession cqlSession() { + return mock(CqlSession.class); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfigurationTests.java index 63612052881..51ddff301e4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraReactiveRepositoriesAutoConfigurationTests.java @@ -18,8 +18,8 @@ package org.springframework.boot.autoconfigure.data.cassandra; import java.util.Set; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -61,7 +61,7 @@ class CassandraReactiveRepositoriesAutoConfigurationTests { void testDefaultRepositoryConfiguration() { this.contextRunner.withUserConfiguration(DefaultConfiguration.class).run((context) -> { assertThat(context).hasSingleBean(ReactiveCityRepository.class); - assertThat(context).hasSingleBean(Cluster.class); + assertThat(context).hasSingleBean(CqlSessionBuilder.class); assertThat(getInitialEntitySet(context)).hasSize(1); }); } @@ -69,7 +69,7 @@ class CassandraReactiveRepositoriesAutoConfigurationTests { @Test void testNoRepositoryConfiguration() { this.contextRunner.withUserConfiguration(EmptyConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); + assertThat(context).hasSingleBean(CqlSessionBuilder.class); assertThat(getInitialEntitySet(context)).isEmpty(); }); } @@ -106,8 +106,8 @@ class CassandraReactiveRepositoriesAutoConfigurationTests { static class TestConfiguration { @Bean - Session session() { - return mock(Session.class); + CqlSession cqlSession() { + return mock(CqlSession.class); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfigurationTests.java index c20fc73bebc..4f6aa0f5de6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraRepositoriesAutoConfigurationTests.java @@ -18,8 +18,8 @@ package org.springframework.boot.autoconfigure.data.cassandra; import java.util.Set; -import com.datastax.driver.core.Cluster; -import com.datastax.driver.core.Session; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -59,7 +59,7 @@ class CassandraRepositoriesAutoConfigurationTests { void testDefaultRepositoryConfiguration() { this.contextRunner.withUserConfiguration(DefaultConfiguration.class).run((context) -> { assertThat(context).hasSingleBean(CityRepository.class); - assertThat(context).hasSingleBean(Cluster.class); + assertThat(context).hasSingleBean(CqlSessionBuilder.class); assertThat(getInitialEntitySet(context)).hasSize(1); }); } @@ -67,7 +67,7 @@ class CassandraRepositoriesAutoConfigurationTests { @Test void testNoRepositoryConfiguration() { this.contextRunner.withUserConfiguration(EmptyConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(Cluster.class); + assertThat(context).hasSingleBean(CqlSessionBuilder.class); assertThat(getInitialEntitySet(context)).isEmpty(); }); } @@ -104,8 +104,8 @@ class CassandraRepositoriesAutoConfigurationTests { static class TestConfiguration { @Bean - Session session() { - return mock(Session.class); + CqlSession cqlSession() { + return mock(CqlSession.class); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/city/City.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/city/City.java index 92d1b3b6111..8d1053a89ae 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/city/City.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/city/City.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,8 @@ package org.springframework.boot.autoconfigure.data.cassandra.city; -import com.datastax.driver.core.DataType.Name; - import org.springframework.data.cassandra.core.mapping.CassandraType; +import org.springframework.data.cassandra.core.mapping.CassandraType.Name; import org.springframework.data.cassandra.core.mapping.Column; import org.springframework.data.cassandra.core.mapping.PrimaryKey; import org.springframework.data.cassandra.core.mapping.Table; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfigurationTests.java index 1610d8cbbdc..7d9382602a3 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,8 +47,8 @@ import static org.mockito.Mockito.mock; class ElasticsearchAutoConfigurationTests { @Container - public static ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + public static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer() + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)); private AnnotationConfigApplicationContext context; @@ -76,6 +76,7 @@ class ElasticsearchAutoConfigurationTests { } @Test + @SuppressWarnings("deprecation") void createTransportClient() { this.context = new AnnotationConfigApplicationContext(); TestPropertyValues diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java index 074af93e03b..b957169c04f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,10 +30,8 @@ import org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoC import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.EntityMapper; import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate; import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext; @@ -48,12 +46,13 @@ import static org.mockito.Mockito.mock; * @author Artur Konczak * @author Brian Clozel * @author Peter-Josef Meisch + * @author Scott Frederick */ @Testcontainers(disabledWithoutDocker = true) class ElasticsearchDataAutoConfigurationTests { @Container - static ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) + static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer().withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner().withConfiguration( @@ -71,6 +70,7 @@ class ElasticsearchDataAutoConfigurationTests { } @Test + @SuppressWarnings("deprecation") void defaultTransportBeansAreRegistered() { this.contextRunner .withPropertyValues( @@ -83,6 +83,7 @@ class ElasticsearchDataAutoConfigurationTests { } @Test + @SuppressWarnings("deprecation") void defaultTransportBeansNotRegisteredIfNoTransportClient() { this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(ElasticsearchTemplate.class)); } @@ -91,16 +92,11 @@ class ElasticsearchDataAutoConfigurationTests { void defaultRestBeansRegistered() { this.contextRunner.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestTemplate.class) .hasSingleBean(ReactiveElasticsearchTemplate.class).hasSingleBean(ElasticsearchConverter.class) - .hasSingleBean(SimpleElasticsearchMappingContext.class).hasSingleBean(EntityMapper.class) .hasSingleBean(ElasticsearchConverter.class)); } @Test - void defaultEntityMapperRegistered() { - this.contextRunner.run((context) -> assertThat(context).hasSingleBean(EntityMapper.class)); - } - - @Test + @SuppressWarnings("deprecation") void customTransportTemplateShouldBeUsed() { this.contextRunner.withUserConfiguration(CustomTransportTemplate.class).run((context) -> assertThat(context) .getBeanNames(ElasticsearchTemplate.class).hasSize(1).contains("elasticsearchTemplate")); @@ -119,16 +115,11 @@ class ElasticsearchDataAutoConfigurationTests { .contains("reactiveElasticsearchTemplate")); } - @Test - void customEntityMapperShouldeBeUsed() { - this.contextRunner.withUserConfiguration(CustomEntityMapper.class).run((context) -> assertThat(context) - .getBeanNames(EntityMapper.class).containsExactly("elasticsearchEntityMapper")); - } - @Configuration(proxyBeanMethods = false) static class CustomTransportTemplate { @Bean + @SuppressWarnings("deprecation") ElasticsearchTemplate elasticsearchTemplate() { return mock(ElasticsearchTemplate.class); } @@ -155,14 +146,4 @@ class ElasticsearchDataAutoConfigurationTests { } - @Configuration(proxyBeanMethods = false) - static class CustomEntityMapper { - - @Bean - EntityMapper elasticsearchEntityMapper() { - return mock(ElasticsearchEntityMapper.class); - } - - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java index 1dc47256631..dd53c7dff8a 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchRepositoriesAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,8 +48,8 @@ import static org.assertj.core.api.Assertions.assertThat; class ElasticsearchRepositoriesAutoConfigurationTests { @Container - static final ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) - .withStartupTimeout(Duration.ofMinutes(10)); + static final ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer() + .withStartupAttempts(5).withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration( diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java index a98e98e8502..cccf59b44aa 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveElasticsearchRepositoriesAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ import static org.assertj.core.api.Assertions.assertThat; public class ReactiveElasticsearchRepositoriesAutoConfigurationTests { @Container - static ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) + static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer().withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java index 614c598ae7f..1e404f32b90 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ReactiveRestClientAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ import static org.mockito.Mockito.mock; public class ReactiveRestClientAutoConfigurationTests { @Container - static ElasticsearchContainer elasticsearch = new ElasticsearchContainer().withStartupAttempts(5) + static ElasticsearchContainer elasticsearch = new VersionOverridingElasticsearchContainer().withStartupAttempts(5) .withStartupTimeout(Duration.ofMinutes(10)); private ApplicationContextRunner contextRunner = new ApplicationContextRunner() @@ -83,9 +83,10 @@ public class ReactiveRestClientAutoConfigurationTests { Map source = new HashMap<>(); source.put("a", "alpha"); source.put("b", "bravo"); - IndexRequest index = new IndexRequest("foo", "bar", "1").source(source); - GetRequest getRequest = new GetRequest("foo", "bar", "1"); - GetResult getResult = client.index(index).then(client.get(getRequest)).block(); + IndexRequest indexRequest = new IndexRequest("foo").id("1").source(source); + GetRequest getRequest = new GetRequest("foo").id("1"); + GetResult getResult = client.index(indexRequest).then(client.get(getRequest)).block(); + assertThat(getResult).isNotNull(); assertThat(getResult.isExists()).isTrue(); }); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java new file mode 100644 index 00000000000..441cf1547d0 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/VersionOverridingElasticsearchContainer.java @@ -0,0 +1,41 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.boot.autoconfigure.data.elasticsearch; + +import org.testcontainers.elasticsearch.ElasticsearchContainer; + +/** + * Extension of {@link ElasticsearchContainer} to override default version. + * + * @author Scott Frederick + */ +public class VersionOverridingElasticsearchContainer extends ElasticsearchContainer { + + /** + * Elasticsearch Docker base URL + */ + private static final String ELASTICSEARCH_IMAGE = "docker.elastic.co/elasticsearch/elasticsearch"; + + /** + * Elasticsearch version + */ + protected static final String ELASTICSEARCH_VERSION = "7.5.1"; + + public VersionOverridingElasticsearchContainer() { + super(ELASTICSEARCH_IMAGE + ":" + ELASTICSEARCH_VERSION); + } + +} diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index a9884bbbaaf..39fc7425a7a 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -159,11 +159,11 @@ bom { ] } } - library('Cassandra Driver', '3.7.2') { - group('com.datastax.cassandra') { + library('Cassandra Driver', '4.3.1') { + group('com.datastax.oss') { modules = [ - 'cassandra-driver-core', - 'cassandra-driver-mapping' + 'java-driver-core', + 'java-driver-query-builder' ] } } @@ -288,7 +288,7 @@ bom { ] } } - library('Elasticsearch', '6.8.5') { + library('Elasticsearch', '7.5.1') { group('org.elasticsearch') { modules = [ 'elasticsearch' @@ -1663,7 +1663,7 @@ bom { ] } } - library('Spring Data Releasetrain', 'Moore-SR3') { + library('Spring Data Releasetrain', 'Neumann-BUILD-SNAPSHOT') { group('org.springframework.data') { imports = [ 'spring-data-releasetrain' diff --git a/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle index b4b18cc55ce..e5ea8d2ffda 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle +++ b/spring-boot-project/spring-boot-tools/spring-boot-test-support/build.gradle @@ -6,7 +6,7 @@ plugins { description = 'Spring Boot Testing Support' dependencies { - compileOnly "com.datastax.cassandra:cassandra-driver-core" + compileOnly "com.datastax.oss:java-driver-core" compileOnly "javax.servlet:javax.servlet-api" compileOnly "junit:junit" compileOnly "org.junit.jupiter:junit-jupiter" diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/Customer.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/Customer.java deleted file mode 100644 index 7449be839d0..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/Customer.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.data.cassandra; - -import java.util.UUID; - -import org.springframework.data.cassandra.core.mapping.PrimaryKey; -import org.springframework.data.cassandra.core.mapping.Table; - -@Table -public class Customer { - - @PrimaryKey - private UUID id; - - private String firstName; - - private String lastName; - - public Customer() { - } - - public Customer(UUID id, String firstName, String lastName) { - this.id = id; - this.firstName = firstName; - this.lastName = lastName; - } - - @Override - public String toString() { - return String.format("Customer[id=%s, firstName='%s', lastName='%s']", this.id, this.firstName, this.lastName); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/CustomerRepository.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/CustomerRepository.java deleted file mode 100644 index f3b9f8b95c2..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/CustomerRepository.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.data.cassandra; - -import java.util.List; - -import org.springframework.data.cassandra.repository.Query; -import org.springframework.data.repository.CrudRepository; - -public interface CustomerRepository extends CrudRepository { - - @Query("Select * from customer where firstname=?0") - Customer findByFirstName(String firstName); - - @Query("Select * from customer where lastname=?0") - List findByLastName(String lastName); - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/SampleCassandraApplication.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/SampleCassandraApplication.java deleted file mode 100644 index a4a0cf065a2..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/java/smoketest/data/cassandra/SampleCassandraApplication.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.data.cassandra; - -import com.datastax.driver.core.utils.UUIDs; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SampleCassandraApplication implements CommandLineRunner { - - @Autowired - private CustomerRepository repository; - - @Override - public void run(String... args) throws Exception { - this.repository.deleteAll(); - - // save a couple of customers - this.repository.save(new Customer(UUIDs.timeBased(), "Alice", "Smith")); - this.repository.save(new Customer(UUIDs.timeBased(), "Bob", "Smith")); - - // fetch all customers - System.out.println("Customers found with findAll():"); - System.out.println("-------------------------------"); - for (Customer customer : this.repository.findAll()) { - System.out.println(customer); - } - System.out.println(); - - // fetch an individual customer - System.out.println("Customer found with findByFirstName('Alice'):"); - System.out.println("--------------------------------"); - System.out.println(this.repository.findByFirstName("Alice")); - - System.out.println("Customers found with findByLastName('Smith'):"); - System.out.println("--------------------------------"); - for (Customer customer : this.repository.findByLastName("Smith")) { - System.out.println(customer); - } - } - - public static void main(String[] args) { - SpringApplication.run(SampleCassandraApplication.class, args); - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/resources/application.properties b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/resources/application.properties deleted file mode 100644 index 74ed2fea557..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.data.cassandra.keyspace-name=mykeyspace diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/OrderedCassandraTestExecutionListener.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/OrderedCassandraTestExecutionListener.java deleted file mode 100644 index cb5e3a641b4..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/OrderedCassandraTestExecutionListener.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.data.cassandra; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.cassandraunit.spring.CassandraUnitDependencyInjectionTestExecutionListener; - -import org.springframework.core.Ordered; - -public class OrderedCassandraTestExecutionListener extends CassandraUnitDependencyInjectionTestExecutionListener { - - private static final Log logger = LogFactory.getLog(OrderedCassandraTestExecutionListener.class); - - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE; - } - - @Override - protected void cleanServer() { - try { - super.cleanServer(); - } - catch (Exception ex) { - logger.warn("Failure during server cleanup", ex); - } - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/SampleCassandraApplicationTests.java b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/SampleCassandraApplicationTests.java deleted file mode 100644 index 74e010bc33c..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/java/smoketest/data/cassandra/SampleCassandraApplicationTests.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012-2019 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package smoketest.data.cassandra; - -import java.io.File; - -import org.cassandraunit.spring.CassandraDataSet; -import org.cassandraunit.spring.EmbeddedCassandra; -import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.system.CapturedOutput; -import org.springframework.boot.test.system.OutputCaptureExtension; -import org.springframework.test.context.TestExecutionListeners; -import org.springframework.test.context.TestExecutionListeners.MergeMode; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link SampleCassandraApplication}. - */ -@TestExecutionListeners(mergeMode = MergeMode.MERGE_WITH_DEFAULTS, - listeners = { OrderedCassandraTestExecutionListener.class }) -@ExtendWith(OutputCaptureExtension.class) -@SpringBootTest -@CassandraDataSet(keyspace = "mykeyspace", value = "setup.cql") -@EmbeddedCassandra(timeout = 60000) -class SampleCassandraApplicationTests { - - @Test - void testDefaultSettings(CapturedOutput output) { - Assumptions.assumeFalse(this::runningOnWindows); - assertThat(output).contains("firstName='Alice', lastName='Smith'"); - } - - private boolean runningOnWindows() { - return File.separatorChar == '\\'; - } - -} diff --git a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/resources/setup.cql b/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/resources/setup.cql deleted file mode 100644 index de52ba67df7..00000000000 --- a/spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-data-cassandra/src/test/resources/setup.cql +++ /dev/null @@ -1,3 +0,0 @@ -CREATE TABLE customer (id TimeUUID PRIMARY KEY, firstname text, lastname text); -CREATE INDEX customerfistnameindex ON customer (firstname); -CREATE INDEX customersecondnameindex ON customer (lastname);