3434import org .springframework .beans .factory .ObjectProvider ;
3535import org .springframework .boot .autoconfigure .AutoConfiguration ;
3636import org .springframework .boot .autoconfigure .EnableAutoConfiguration ;
37+ import org .springframework .boot .autoconfigure .condition .AnyNestedCondition ;
38+ import org .springframework .boot .autoconfigure .condition .ConditionalOnBean ;
3739import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
3840import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
3941import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
4042import org .springframework .boot .autoconfigure .condition .ConditionalOnSingleCandidate ;
43+ import org .springframework .boot .autoconfigure .couchbase .CouchbaseAutoConfiguration .CouchbaseCondition ;
4144import org .springframework .boot .autoconfigure .couchbase .CouchbaseProperties .Timeouts ;
4245import org .springframework .boot .autoconfigure .jackson .JacksonAutoConfiguration ;
4346import org .springframework .boot .context .properties .EnableConfigurationProperties ;
4447import org .springframework .context .annotation .Bean ;
48+ import org .springframework .context .annotation .Conditional ;
4549import org .springframework .context .annotation .Configuration ;
4650import org .springframework .core .Ordered ;
4751import org .springframework .util .ResourceUtils ;
5256 * @author Eddú Meléndez
5357 * @author Stephane Nicoll
5458 * @author Yulin Qin
59+ * @author Moritz Halbritter
60+ * @author Andy Wilkinson
61+ * @author Phillip Webb
5562 * @since 1.4.0
5663 */
5764@ AutoConfiguration (after = JacksonAutoConfiguration .class )
5865@ ConditionalOnClass (Cluster .class )
59- @ ConditionalOnProperty ( "spring.couchbase.connection-string" )
66+ @ Conditional ( CouchbaseCondition . class )
6067@ EnableConfigurationProperties (CouchbaseProperties .class )
6168public class CouchbaseAutoConfiguration {
6269
70+ private final CouchbaseProperties properties ;
71+
72+ private final CouchbaseConnectionDetails connectionDetails ;
73+
74+ CouchbaseAutoConfiguration (CouchbaseProperties properties ,
75+ ObjectProvider <CouchbaseConnectionDetails > connectionDetails ) {
76+ this .properties = properties ;
77+ this .connectionDetails = connectionDetails
78+ .getIfAvailable (() -> new PropertiesCouchbaseConnectionDetails (properties ));
79+ }
80+
6381 @ Bean
6482 @ ConditionalOnMissingBean
65- public ClusterEnvironment couchbaseClusterEnvironment (CouchbaseProperties properties ,
83+ public ClusterEnvironment couchbaseClusterEnvironment (
6684 ObjectProvider <ClusterEnvironmentBuilderCustomizer > customizers ) {
67- Builder builder = initializeEnvironmentBuilder (properties );
85+ Builder builder = initializeEnvironmentBuilder ();
6886 customizers .orderedStream ().forEach ((customizer ) -> customizer .customize (builder ));
6987 return builder .build ();
7088 }
7189
7290 @ Bean (destroyMethod = "disconnect" )
7391 @ ConditionalOnMissingBean
74- public Cluster couchbaseCluster (CouchbaseProperties properties , ClusterEnvironment couchbaseClusterEnvironment ) {
75- ClusterOptions options = ClusterOptions .clusterOptions (properties .getUsername (), properties .getPassword ())
92+ public Cluster couchbaseCluster (ClusterEnvironment couchbaseClusterEnvironment ) {
93+ ClusterOptions options = ClusterOptions
94+ .clusterOptions (this .connectionDetails .getUsername (), this .connectionDetails .getPassword ())
7695 .environment (couchbaseClusterEnvironment );
77- return Cluster .connect (properties .getConnectionString (), options );
96+ return Cluster .connect (this . connectionDetails .getConnectionString (), options );
7897 }
7998
80- private ClusterEnvironment .Builder initializeEnvironmentBuilder (CouchbaseProperties properties ) {
99+ private ClusterEnvironment .Builder initializeEnvironmentBuilder () {
81100 ClusterEnvironment .Builder builder = ClusterEnvironment .builder ();
82- Timeouts timeouts = properties .getEnv ().getTimeouts ();
101+ Timeouts timeouts = this . properties .getEnv ().getTimeouts ();
83102 builder .timeoutConfig ((config ) -> config .kvTimeout (timeouts .getKeyValue ())
84103 .analyticsTimeout (timeouts .getAnalytics ())
85104 .kvDurableTimeout (timeouts .getKeyValueDurable ())
@@ -89,13 +108,14 @@ private ClusterEnvironment.Builder initializeEnvironmentBuilder(CouchbasePropert
89108 .managementTimeout (timeouts .getManagement ())
90109 .connectTimeout (timeouts .getConnect ())
91110 .disconnectTimeout (timeouts .getDisconnect ()));
92- CouchbaseProperties .Io io = properties .getEnv ().getIo ();
111+ CouchbaseProperties .Io io = this . properties .getEnv ().getIo ();
93112 builder .ioConfig ((config ) -> config .maxHttpConnections (io .getMaxEndpoints ())
94113 .numKvConnections (io .getMinEndpoints ())
95114 .idleHttpConnectionTimeout (io .getIdleHttpConnectionTimeout ()));
96- if (properties .getEnv ().getSsl ().getEnabled ()) {
115+ if ((this .connectionDetails instanceof PropertiesCouchbaseConnectionDetails )
116+ && this .properties .getEnv ().getSsl ().getEnabled ()) {
97117 builder .securityConfig ((config ) -> config .enableTls (true )
98- .trustManagerFactory (getTrustManagerFactory (properties .getEnv ().getSsl ())));
118+ .trustManagerFactory (getTrustManagerFactory (this . properties .getEnv ().getSsl ())));
99119 }
100120 return builder ;
101121 }
@@ -157,4 +177,54 @@ public int getOrder() {
157177
158178 }
159179
180+ /**
181+ * Condition that matches when {@code spring.couchbase.connection-string} has been
182+ * configured or there is a {@link CouchbaseConnectionDetails} bean.
183+ */
184+ static final class CouchbaseCondition extends AnyNestedCondition {
185+
186+ CouchbaseCondition () {
187+ super (ConfigurationPhase .REGISTER_BEAN );
188+ }
189+
190+ @ ConditionalOnProperty (prefix = "spring.couchbase" , name = "connection-string" )
191+ private static final class CouchbaseUrlCondition {
192+
193+ }
194+
195+ @ ConditionalOnBean (CouchbaseConnectionDetails .class )
196+ private static final class CouchbaseConnectionDetailsCondition {
197+
198+ }
199+
200+ }
201+
202+ /**
203+ * Adapts {@link CouchbaseProperties} to {@link CouchbaseConnectionDetails}.
204+ */
205+ static final class PropertiesCouchbaseConnectionDetails implements CouchbaseConnectionDetails {
206+
207+ private final CouchbaseProperties properties ;
208+
209+ PropertiesCouchbaseConnectionDetails (CouchbaseProperties properties ) {
210+ this .properties = properties ;
211+ }
212+
213+ @ Override
214+ public String getConnectionString () {
215+ return this .properties .getConnectionString ();
216+ }
217+
218+ @ Override
219+ public String getUsername () {
220+ return this .properties .getUsername ();
221+ }
222+
223+ @ Override
224+ public String getPassword () {
225+ return this .properties .getPassword ();
226+ }
227+
228+ }
229+
160230}
0 commit comments