34
34
import org .springframework .beans .factory .ObjectProvider ;
35
35
import org .springframework .boot .autoconfigure .AutoConfiguration ;
36
36
import org .springframework .boot .autoconfigure .EnableAutoConfiguration ;
37
+ import org .springframework .boot .autoconfigure .condition .AnyNestedCondition ;
38
+ import org .springframework .boot .autoconfigure .condition .ConditionalOnBean ;
37
39
import org .springframework .boot .autoconfigure .condition .ConditionalOnClass ;
38
40
import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
39
41
import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
40
42
import org .springframework .boot .autoconfigure .condition .ConditionalOnSingleCandidate ;
43
+ import org .springframework .boot .autoconfigure .couchbase .CouchbaseAutoConfiguration .CouchbaseCondition ;
41
44
import org .springframework .boot .autoconfigure .couchbase .CouchbaseProperties .Timeouts ;
42
45
import org .springframework .boot .autoconfigure .jackson .JacksonAutoConfiguration ;
43
46
import org .springframework .boot .context .properties .EnableConfigurationProperties ;
44
47
import org .springframework .context .annotation .Bean ;
48
+ import org .springframework .context .annotation .Conditional ;
45
49
import org .springframework .context .annotation .Configuration ;
46
50
import org .springframework .core .Ordered ;
47
51
import org .springframework .util .ResourceUtils ;
52
56
* @author Eddú Meléndez
53
57
* @author Stephane Nicoll
54
58
* @author Yulin Qin
59
+ * @author Moritz Halbritter
60
+ * @author Andy Wilkinson
61
+ * @author Phillip Webb
55
62
* @since 1.4.0
56
63
*/
57
64
@ AutoConfiguration (after = JacksonAutoConfiguration .class )
58
65
@ ConditionalOnClass (Cluster .class )
59
- @ ConditionalOnProperty ( "spring.couchbase.connection-string" )
66
+ @ Conditional ( CouchbaseCondition . class )
60
67
@ EnableConfigurationProperties (CouchbaseProperties .class )
61
68
public class CouchbaseAutoConfiguration {
62
69
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
+
63
81
@ Bean
64
82
@ ConditionalOnMissingBean
65
- public ClusterEnvironment couchbaseClusterEnvironment (CouchbaseProperties properties ,
83
+ public ClusterEnvironment couchbaseClusterEnvironment (
66
84
ObjectProvider <ClusterEnvironmentBuilderCustomizer > customizers ) {
67
- Builder builder = initializeEnvironmentBuilder (properties );
85
+ Builder builder = initializeEnvironmentBuilder ();
68
86
customizers .orderedStream ().forEach ((customizer ) -> customizer .customize (builder ));
69
87
return builder .build ();
70
88
}
71
89
72
90
@ Bean (destroyMethod = "disconnect" )
73
91
@ 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 ())
76
95
.environment (couchbaseClusterEnvironment );
77
- return Cluster .connect (properties .getConnectionString (), options );
96
+ return Cluster .connect (this . connectionDetails .getConnectionString (), options );
78
97
}
79
98
80
- private ClusterEnvironment .Builder initializeEnvironmentBuilder (CouchbaseProperties properties ) {
99
+ private ClusterEnvironment .Builder initializeEnvironmentBuilder () {
81
100
ClusterEnvironment .Builder builder = ClusterEnvironment .builder ();
82
- Timeouts timeouts = properties .getEnv ().getTimeouts ();
101
+ Timeouts timeouts = this . properties .getEnv ().getTimeouts ();
83
102
builder .timeoutConfig ((config ) -> config .kvTimeout (timeouts .getKeyValue ())
84
103
.analyticsTimeout (timeouts .getAnalytics ())
85
104
.kvDurableTimeout (timeouts .getKeyValueDurable ())
@@ -89,13 +108,14 @@ private ClusterEnvironment.Builder initializeEnvironmentBuilder(CouchbasePropert
89
108
.managementTimeout (timeouts .getManagement ())
90
109
.connectTimeout (timeouts .getConnect ())
91
110
.disconnectTimeout (timeouts .getDisconnect ()));
92
- CouchbaseProperties .Io io = properties .getEnv ().getIo ();
111
+ CouchbaseProperties .Io io = this . properties .getEnv ().getIo ();
93
112
builder .ioConfig ((config ) -> config .maxHttpConnections (io .getMaxEndpoints ())
94
113
.numKvConnections (io .getMinEndpoints ())
95
114
.idleHttpConnectionTimeout (io .getIdleHttpConnectionTimeout ()));
96
- if (properties .getEnv ().getSsl ().getEnabled ()) {
115
+ if ((this .connectionDetails instanceof PropertiesCouchbaseConnectionDetails )
116
+ && this .properties .getEnv ().getSsl ().getEnabled ()) {
97
117
builder .securityConfig ((config ) -> config .enableTls (true )
98
- .trustManagerFactory (getTrustManagerFactory (properties .getEnv ().getSsl ())));
118
+ .trustManagerFactory (getTrustManagerFactory (this . properties .getEnv ().getSsl ())));
99
119
}
100
120
return builder ;
101
121
}
@@ -157,4 +177,54 @@ public int getOrder() {
157
177
158
178
}
159
179
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
+
160
230
}
0 commit comments