package com.easyooo.framework.support.redis.shard;

import static org.springframework.util.Assert.notNull;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;

import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedisPool;

import com.easyooo.framework.common.net.HostAndPort;

/**
 * 
 * Redis Client for multiple servers,
 * 
 * 所有来自GenericObjectPoolConfig都可以通过setter method来设置
 * 
 * @see GenericObjectPoolConfig
 *
 * @author Killer
 */
public class ShardedJedisClientFactoryBean extends GenericObjectPoolConfig 
	implements FactoryBean<ShardedJedisPool>, InitializingBean, DisposableBean {

	private ShardedJedisPool shardedJedisPool;
	
	private String connectionString;
	
	@Override
	public void destroy() throws Exception {
		if(shardedJedisPool != null){
			shardedJedisPool.destroy();
		}
	}

	@Override
	public ShardedJedisPool getObject() throws Exception {
		return shardedJedisPool;
	}

	@Override
	public Class<?> getObjectType() {
		return ShardedJedisPool.class;
	}

	@Override
	public boolean isSingleton() {
		return true;
	}
	
	@Override
	public void afterPropertiesSet() throws Exception {
		notNull(connectionString, "Property 'connectionString' is required");
		List<HostAndPort> haps = HostAndPort.fromStringArray(connectionString);
		List<JedisShardInfo> jsi = new ArrayList<>();
		for (HostAndPort hap : haps) {
			jsi.add(new JedisShardInfo(hap.getHost(), hap.getPort()));
		}
		shardedJedisPool = new ShardedJedisPool(this, jsi);
	}

	public void setConnectionString(String connectionString) {
		this.connectionString = connectionString;
	}
	
}