/**
 * 版本修订记录
 * 创建:2013-1-8
 * 版本:
 *
 * 修订1:  说明:
 * 修订2:  说明:
 */
package org.howsun.redis;

import java.util.List;
import java.util.regex.Pattern;

import org.apache.commons.pool.BasePoolableObjectFactory;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.util.Hashing;


/**
 * 描述:
 * @author howsun
 * @version 3.0
 * Building Time 2013-1-8
 *
 */
public class ShardedCacheFactory extends redis.clients.util.Pool<ShardedJedis> {

	//private static org.howsun.log.Log log = org.howsun.log.LogFactory.getLog(CacheFactory.class);

	public ShardedCacheFactory(final CacheFactoryConfig connectionConfig) {
		super(connectionConfig, new ShardedJedisFactory(connectionConfig.getJedisShardInfos(), Hashing.MURMUR_HASH, null));
	}

	private static class ShardedJedisFactory extends BasePoolableObjectFactory {
		private List<JedisShardInfo> shards;
		private Hashing algo;
		private Pattern keyTagPattern;

		public ShardedJedisFactory(List<JedisShardInfo> shards, Hashing algo,
				Pattern keyTagPattern) {
			this.shards = shards;
			this.algo = algo;
			this.keyTagPattern = keyTagPattern;
		}

		public Object makeObject() throws Exception {
			ShardedJedis jedis = new ShardedJedis(shards, algo, keyTagPattern);
			return jedis;
		}

		public void destroyObject(final Object obj) throws Exception {
			if ((obj != null) && (obj instanceof ShardedJedis)) {
				ShardedJedis shardedJedis = (ShardedJedis) obj;
				for (Jedis jedis : shardedJedis.getAllShards()) {
					try {
						try {
							jedis.quit();
						} catch (Exception e) {

						}
						jedis.disconnect();
					} catch (Exception e) {

					}
				}
			}
		}

		public boolean validateObject(final Object obj) {
			try {
				ShardedJedis jedis = (ShardedJedis) obj;
				for (Jedis shard : jedis.getAllShards()) {
					if (!shard.ping().equals("PONG")) {
						return false;
					}
				}
				return true;
			} catch (Exception ex) {
				return false;
			}
		}
	}
}