Java tutorial
/** * Copyright (C) 2014 Couchbase, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALING * IN THE SOFTWARE. */ package com.couchbase.client.core.util; import com.couchbase.client.core.ClusterFacade; import com.couchbase.client.core.CouchbaseCore; import com.couchbase.client.core.env.CoreEnvironment; import com.couchbase.client.core.env.DefaultCoreEnvironment; import com.couchbase.client.core.message.cluster.DisconnectRequest; import com.couchbase.client.core.message.cluster.OpenBucketRequest; import com.couchbase.client.core.message.cluster.OpenBucketResponse; import com.couchbase.client.core.message.cluster.SeedNodesRequest; import com.couchbase.client.core.message.cluster.SeedNodesResponse; import com.couchbase.client.core.message.config.ClusterConfigRequest; import com.couchbase.client.core.message.config.ClusterConfigResponse; import com.couchbase.client.core.message.config.FlushRequest; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.util.ResourceLeakDetector; import org.junit.AfterClass; import org.junit.BeforeClass; import rx.Observable; import rx.functions.Func1; import java.util.List; import java.util.Map; /** * Base test class for tests that need a working cluster reference. * * @author Michael Nitschinger */ public class ClusterDependentTest { static { ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.PARANOID); } private static final String seedNode = TestProperties.seedNode(); private static final String bucket = TestProperties.bucket(); private static final String password = TestProperties.password(); private static final CoreEnvironment env = DefaultCoreEnvironment.builder().dcpEnabled(true).build(); private static ClusterFacade cluster; @BeforeClass public static void connect() { cluster = new CouchbaseCore(env); cluster.<SeedNodesResponse>send(new SeedNodesRequest(seedNode)) .flatMap(new Func1<SeedNodesResponse, Observable<OpenBucketResponse>>() { @Override public Observable<OpenBucketResponse> call(SeedNodesResponse response) { return cluster.send(new OpenBucketRequest(bucket, password)); } }).toBlocking().single(); cluster.send(new FlushRequest(bucket, password)).toBlocking().single(); } @AfterClass public static void disconnect() throws InterruptedException { cluster.send(new DisconnectRequest()).toBlocking().first(); } public static String password() { return password; } public static ClusterFacade cluster() { return cluster; } public static String bucket() { return bucket; } public static CoreEnvironment env() { return env; } /** * Checks based on the cluster node versions if DCP is available. * * @return true if all nodes in the cluster are version 3 or later. */ public static boolean isDCPEnabled() throws Exception { ClusterConfigResponse response = cluster() .<ClusterConfigResponse>send(new ClusterConfigRequest("Administrator", "password")).toBlocking() .single(); return minNodeVersionFromConfig(response.config()) >= 3; } private static Integer minNodeVersionFromConfig(String rawConfig) throws Exception { ObjectMapper mapper = new ObjectMapper(); JavaType type = mapper.getTypeFactory().constructMapType(Map.class, String.class, Object.class); Map<String, Object> result = mapper.readValue(rawConfig, type); List<Object> nodes = (List<Object>) result.get("nodes"); int min = 99; for (Object n : nodes) { Map<String, Object> node = (Map<String, Object>) n; String version = (String) node.get("version"); int major = Integer.parseInt(version.substring(0, 1)); if (major < min) { min = major; } } return min; } }