package com.lordofthejars.nosqlunit.couchbase;
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.CouchbaseCluster;
import com.couchbase.client.java.cluster.BucketSettings;
import com.couchbase.client.java.cluster.ClusterManager;
import com.couchbase.client.java.cluster.DefaultBucketSettings;
import com.lordofthejars.nosqlunit.core.AbstractJsr330Configuration;
import org.awaitility.Awaitility;
import java.net.URI;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import static org.awaitility.Awaitility.await;
public class CouchbaseConfiguration extends AbstractJsr330Configuration {
private final List<URI> urlList;
private String clusterUsername;
private String clusterPassword;
private final String bucketPassword;
private final String bucketName;
private final boolean createBucket;
private Bucket bucket;
private CouchbaseCluster couchbaseCluster;
public CouchbaseConfiguration(final List<URI> urlList, final String bucketPassword, final String bucketName, final boolean createBucket) {
this.urlList = urlList;
this.bucketPassword = bucketPassword;
this.bucketName = bucketName;
this.couchbaseCluster = CouchbaseCluster.create(
urlList.stream().map(URI::toString).collect(Collectors.toList())
);
this.createBucket = createBucket;
}
private void connectToBucket() {
if (createBucket) {
final ClusterManager clusterManager = couchbaseCluster.clusterManager(this.clusterUsername, this.clusterPassword);
if (! clusterManager.hasBucket(this.bucketName)) {
// Create Bucket
final DefaultBucketSettings defaultBucketSettings = DefaultBucketSettings.builder()
.enableFlush(true)
.name(bucketName).build();
clusterManager.insertBucket(defaultBucketSettings);
await()
.atMost(30, TimeUnit.SECONDS)
.until(() -> clusterManager.hasBucket(bucketName));
}
}
if (this.bucketPassword != null) {
this.bucket = couchbaseCluster.openBucket(this.bucketName, this.bucketPassword);
} else {
this.bucket = couchbaseCluster.openBucket(this.bucketName);
}
}
public List<URI> getUrlList() {
return urlList;
}
public String getBucketPassword() {
return bucketPassword;
}
public String getBucketName() {
return bucketName;
}
public void setClusterUsername(String clusterUsername) {
this.clusterUsername = clusterUsername;
}
public void setClusterPassword(String clusterPassword) {
this.clusterPassword = clusterPassword;
}
public Bucket getBucket() {
if (bucket == null) {
connectToBucket();
}
return bucket;
}
public CouchbaseCluster getCouchbaseCluster() {
return couchbaseCluster;
}
}