@ -34,14 +34,18 @@ import com.fasterxml.jackson.databind.ObjectMapper;
@@ -34,14 +34,18 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.ObjectProvider ;
import org.springframework.boot.autoconfigure.AutoConfiguration ;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration ;
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition ;
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.condition.ConditionalOnProperty ;
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate ;
import org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration.CouchbaseCondition ;
import org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties.Timeouts ;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration ;
import org.springframework.boot.context.properties.EnableConfigurationProperties ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Conditional ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.core.Ordered ;
import org.springframework.util.ResourceUtils ;
@ -52,34 +56,49 @@ import org.springframework.util.ResourceUtils;
@@ -52,34 +56,49 @@ import org.springframework.util.ResourceUtils;
* @author Eddú Meléndez
* @author Stephane Nicoll
* @author Yulin Qin
* @author Moritz Halbritter
* @author Andy Wilkinson
* @author Phillip Webb
* @since 1 . 4 . 0
* /
@AutoConfiguration ( after = JacksonAutoConfiguration . class )
@ConditionalOnClass ( Cluster . class )
@ConditionalOnProperty ( "spring.couchbase.connection-string" )
@Conditional ( CouchbaseCondition . class )
@EnableConfigurationProperties ( CouchbaseProperties . class )
public class CouchbaseAutoConfiguration {
private final CouchbaseProperties properties ;
private final CouchbaseConnectionDetails connectionDetails ;
CouchbaseAutoConfiguration ( CouchbaseProperties properties ,
ObjectProvider < CouchbaseConnectionDetails > connectionDetails ) {
this . properties = properties ;
this . connectionDetails = connectionDetails
. getIfAvailable ( ( ) - > new PropertiesCouchbaseConnectionDetails ( properties ) ) ;
}
@Bean
@ConditionalOnMissingBean
public ClusterEnvironment couchbaseClusterEnvironment ( CouchbaseProperties properties ,
public ClusterEnvironment couchbaseClusterEnvironment (
ObjectProvider < ClusterEnvironmentBuilderCustomizer > customizers ) {
Builder builder = initializeEnvironmentBuilder ( properties ) ;
Builder builder = initializeEnvironmentBuilder ( ) ;
customizers . orderedStream ( ) . forEach ( ( customizer ) - > customizer . customize ( builder ) ) ;
return builder . build ( ) ;
}
@Bean ( destroyMethod = "disconnect" )
@ConditionalOnMissingBean
public Cluster couchbaseCluster ( CouchbaseProperties properties , ClusterEnvironment couchbaseClusterEnvironment ) {
ClusterOptions options = ClusterOptions . clusterOptions ( properties . getUsername ( ) , properties . getPassword ( ) )
public Cluster couchbaseCluster ( ClusterEnvironment couchbaseClusterEnvironment ) {
ClusterOptions options = ClusterOptions
. clusterOptions ( this . connectionDetails . getUsername ( ) , this . connectionDetails . getPassword ( ) )
. environment ( couchbaseClusterEnvironment ) ;
return Cluster . connect ( propertie s. getConnectionString ( ) , options ) ;
return Cluster . connect ( this . connectionDetail s. getConnectionString ( ) , options ) ;
}
private ClusterEnvironment . Builder initializeEnvironmentBuilder ( CouchbaseProperties properties ) {
private ClusterEnvironment . Builder initializeEnvironmentBuilder ( ) {
ClusterEnvironment . Builder builder = ClusterEnvironment . builder ( ) ;
Timeouts timeouts = properties . getEnv ( ) . getTimeouts ( ) ;
Timeouts timeouts = this . properties . getEnv ( ) . getTimeouts ( ) ;
builder . timeoutConfig ( ( config ) - > config . kvTimeout ( timeouts . getKeyValue ( ) )
. analyticsTimeout ( timeouts . getAnalytics ( ) )
. kvDurableTimeout ( timeouts . getKeyValueDurable ( ) )
@ -89,13 +108,14 @@ public class CouchbaseAutoConfiguration {
@@ -89,13 +108,14 @@ public class CouchbaseAutoConfiguration {
. managementTimeout ( timeouts . getManagement ( ) )
. connectTimeout ( timeouts . getConnect ( ) )
. disconnectTimeout ( timeouts . getDisconnect ( ) ) ) ;
CouchbaseProperties . Io io = properties . getEnv ( ) . getIo ( ) ;
CouchbaseProperties . Io io = this . properties . getEnv ( ) . getIo ( ) ;
builder . ioConfig ( ( config ) - > config . maxHttpConnections ( io . getMaxEndpoints ( ) )
. numKvConnections ( io . getMinEndpoints ( ) )
. idleHttpConnectionTimeout ( io . getIdleHttpConnectionTimeout ( ) ) ) ;
if ( properties . getEnv ( ) . getSsl ( ) . getEnabled ( ) ) {
if ( ( this . connectionDetails instanceof PropertiesCouchbaseConnectionDetails )
& & this . properties . getEnv ( ) . getSsl ( ) . getEnabled ( ) ) {
builder . securityConfig ( ( config ) - > config . enableTls ( true )
. trustManagerFactory ( getTrustManagerFactory ( properties . getEnv ( ) . getSsl ( ) ) ) ) ;
. trustManagerFactory ( getTrustManagerFactory ( this . properties . getEnv ( ) . getSsl ( ) ) ) ) ;
}
return builder ;
}
@ -157,4 +177,54 @@ public class CouchbaseAutoConfiguration {
@@ -157,4 +177,54 @@ public class CouchbaseAutoConfiguration {
}
/ * *
* Condition that matches when { @code spring . couchbase . connection - string } has been
* configured or there is a { @link CouchbaseConnectionDetails } bean .
* /
static final class CouchbaseCondition extends AnyNestedCondition {
CouchbaseCondition ( ) {
super ( ConfigurationPhase . REGISTER_BEAN ) ;
}
@ConditionalOnProperty ( prefix = "spring.couchbase" , name = "connection-string" )
private static final class CouchbaseUrlCondition {
}
@ConditionalOnBean ( CouchbaseConnectionDetails . class )
private static final class CouchbaseConnectionDetailsCondition {
}
}
/ * *
* Adapts { @link CouchbaseProperties } to { @link CouchbaseConnectionDetails } .
* /
static final class PropertiesCouchbaseConnectionDetails implements CouchbaseConnectionDetails {
private final CouchbaseProperties properties ;
PropertiesCouchbaseConnectionDetails ( CouchbaseProperties properties ) {
this . properties = properties ;
}
@Override
public String getConnectionString ( ) {
return this . properties . getConnectionString ( ) ;
}
@Override
public String getUsername ( ) {
return this . properties . getUsername ( ) ;
}
@Override
public String getPassword ( ) {
return this . properties . getPassword ( ) ;
}
}
}