// Path: src/main/java/com/hyd/ssdb/SsdbClientException.java
// public class SsdbClientException extends SsdbException {
// 
//     public SsdbClientException() {
//     }
// 
//     public SsdbClientException(String message) {
//         super(message);
//     }
// 
//     public SsdbClientException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public SsdbClientException(Throwable cause) {
//         super(cause);
//     }
// }


import com.hyd.ssdb.SsdbClientException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

package com.hyd.ssdb.conf;


/**
 * 根据服务器的拓扑结构，决定一个请求应该被发送到哪台服务器
 * <p>
 * created at 15-12-3
 *
 * @author Yiding
 */
public abstract class Sharding {

    protected List<Cluster> clusters;

    /**
     * 构造方法
     *
     * @param cluster 集群配置，整个负载均衡当中只会有一个集群
     */
    public Sharding(Cluster cluster) {
        this(Collections.singletonList(cluster));
    }

    /**
     * 构造方法
     *
     * @param clusters 集群配置。注意本方法将会使用 clusters 的拷贝，因此调用本方法之后再操作
     *                 clusters（清空或增减元素），不会对 Sharding 有任何影响。
     */
    public Sharding(List<Cluster> clusters) {

        // 清掉可能的 null 元素
        clusters.removeAll(Collections.singleton((Cluster) null));

        if (clusters.isEmpty()) {

// Path: src/main/java/com/hyd/ssdb/SsdbClientException.java
// public class SsdbClientException extends SsdbException {
// 
//     public SsdbClientException() {
//     }
// 
//     public SsdbClientException(String message) {
//         super(message);
//     }
// 
//     public SsdbClientException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public SsdbClientException(Throwable cause) {
//         super(cause);
//     }
// }


// Path: src/main/java/com/hyd/ssdb/conf/Sharding.java
import com.hyd.ssdb.SsdbClientException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

package com.hyd.ssdb.conf;


/**
 * 根据服务器的拓扑结构，决定一个请求应该被发送到哪台服务器
 * <p>
 * created at 15-12-3
 *
 * @author Yiding
 */
public abstract class Sharding {

    protected List<Cluster> clusters;

    /**
     * 构造方法
     *
     * @param cluster 集群配置，整个负载均衡当中只会有一个集群
     */
    public Sharding(Cluster cluster) {
        this(Collections.singletonList(cluster));
    }

    /**
     * 构造方法
     *
     * @param clusters 集群配置。注意本方法将会使用 clusters 的拷贝，因此调用本方法之后再操作
     *                 clusters（清空或增减元素），不会对 Sharding 有任何影响。
     */
    public Sharding(List<Cluster> clusters) {

        // 清掉可能的 null 元素
        clusters.removeAll(Collections.singleton((Cluster) null));

        if (clusters.isEmpty()) {

            throw new SsdbClientException("clusters is empty");
