// Path: src/main/java/com/baidu/beidou/navi/pbrpc/codec/Codec.java
// public interface Codec {
// 
//     /**
//      * 反序列化
//      * 
//      * @param clazz
//      *            反序列化后的类定义
//      * @param bytes
//      *            字节码
//      * @return 反序列化后的对象
//      * @throws CodecException
//      */
//     Object decode(Class<?> clazz, byte[] bytes) throws CodecException;
// 
//     /**
//      * 序列化
//      * 
//      * @param clazz
//      *            待序列化的类定义
//      * @param object
//      *            待序列化的对象
//      * @return 字节码
//      * @throws CodecException
//      */
//     byte[] encode(Class<?> clazz, Object object) throws CodecException;
// 
// }
// 
// Path: src/main/java/com/baidu/beidou/navi/pbrpc/util/Pool.java
// public abstract class Pool<T> {
// 
//     /**
//      * 对象池
//      */
//     private final GenericObjectPool internalPool;
// 
//     /**
//      * Creates a new instance of Pool.
//      * 
//      * @param poolConfig
//      * @param factory
//      */
//     public Pool(final GenericObjectPool.Config poolConfig, PoolableObjectFactory factory) {
//         this.internalPool = new GenericObjectPool(factory, poolConfig);
//     }
// 
//     /**
//      * 从对象池获取一个可用对象
//      * 
//      * @return
//      */
//     @SuppressWarnings("unchecked")
//     public T getResource() {
//         try {
//             return (T) internalPool.borrowObject();
//         } catch (Exception e) {
//             throw new PbrpcConnectionException("Could not get a resource from the pool", e);
//         }
//     }
// 
//     /**
//      * 返回对象到池中
//      * 
//      * @param resource
//      */
//     public void returnResourceObject(final Object resource) {
//         try {
//             internalPool.returnObject(resource);
//         } catch (Exception e) {
//             throw new PbrpcException("Could not return the resource to the pool", e);
//         }
//     }
// 
//     /**
//      * 返回一个调用失败的对象到池中
//      * 
//      * @param resource
//      */
//     public void returnBrokenResource(final T resource) {
//         returnBrokenResourceObject(resource);
//     }
// 
//     /**
//      * 返回对象到池中
//      * 
//      * @param resource
//      */
//     public void returnResource(final T resource) {
//         returnResourceObject(resource);
//     }
// 
//     /**
//      * 返回一个调用失败的对象到池中
//      * 
//      * @param resource
//      */
//     protected void returnBrokenResourceObject(final Object resource) {
//         try {
//             internalPool.invalidateObject(resource);
//         } catch (Exception e) {
//             throw new PbrpcException("Could not return the resource to the pool", e);
//         }
//     }
// 
//     /**
//      * 获取活跃的池中对象数量
//      * 
//      * @return
//      */
//     public int getNumActive() {
//         if (this.internalPool == null || this.internalPool.isClosed()) {
//             return -1;
//         }
// 
//         return this.internalPool.getNumActive();
//     }
// 
//     /**
//      * 获取暂时idle的对象数量
//      * 
//      * @return
//      */
//     public int getNumIdle() {
//         if (this.internalPool == null || this.internalPool.isClosed()) {
//             return -1;
//         }
//         return internalPool.getNumIdle();
//     }
// 
//     /**
//      * 销毁对象池
//      */
//     public void destroy() {
//         try {
//             internalPool.close();
//         } catch (Exception e) {
//             throw new PbrpcException("Could not destroy the pool", e);
//         }
//     }
// 
// }


import org.apache.commons.pool.impl.GenericObjectPool.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baidu.beidou.navi.pbrpc.codec.Codec;
import com.baidu.beidou.navi.pbrpc.util.Pool;
package com.baidu.beidou.navi.pbrpc.client;



/**
 * ClassName: BlockingIOPbrpcClientSocketPool <br/>
 * Function: 客户端连接池，也叫做socket池，转为blocking io使用
 * 
 * @author Zhang Xu
 */
public class BlockingIOPbrpcClientSocketPool extends Pool<BlockingIOPbrpcClient> {

    private static final Logger LOG = LoggerFactory
// Path: src/main/java/com/baidu/beidou/navi/pbrpc/codec/Codec.java
// public interface Codec {
// 
//     /**
//      * 反序列化
//      * 
//      * @param clazz
//      *            反序列化后的类定义
//      * @param bytes
//      *            字节码
//      * @return 反序列化后的对象
//      * @throws CodecException
//      */
//     Object decode(Class<?> clazz, byte[] bytes) throws CodecException;
// 
//     /**
//      * 序列化
//      * 
//      * @param clazz
//      *            待序列化的类定义
//      * @param object
//      *            待序列化的对象
//      * @return 字节码
//      * @throws CodecException
//      */
//     byte[] encode(Class<?> clazz, Object object) throws CodecException;
// 
// }
// 
// Path: src/main/java/com/baidu/beidou/navi/pbrpc/util/Pool.java
// public abstract class Pool<T> {
// 
//     /**
//      * 对象池
//      */
//     private final GenericObjectPool internalPool;
// 
//     /**
//      * Creates a new instance of Pool.
//      * 
//      * @param poolConfig
//      * @param factory
//      */
//     public Pool(final GenericObjectPool.Config poolConfig, PoolableObjectFactory factory) {
//         this.internalPool = new GenericObjectPool(factory, poolConfig);
//     }
// 
//     /**
//      * 从对象池获取一个可用对象
//      * 
//      * @return
//      */
//     @SuppressWarnings("unchecked")
//     public T getResource() {
//         try {
//             return (T) internalPool.borrowObject();
//         } catch (Exception e) {
//             throw new PbrpcConnectionException("Could not get a resource from the pool", e);
//         }
//     }
// 
//     /**
//      * 返回对象到池中
//      * 
//      * @param resource
//      */
//     public void returnResourceObject(final Object resource) {
//         try {
//             internalPool.returnObject(resource);
//         } catch (Exception e) {
//             throw new PbrpcException("Could not return the resource to the pool", e);
//         }
//     }
// 
//     /**
//      * 返回一个调用失败的对象到池中
//      * 
//      * @param resource
//      */
//     public void returnBrokenResource(final T resource) {
//         returnBrokenResourceObject(resource);
//     }
// 
//     /**
//      * 返回对象到池中
//      * 
//      * @param resource
//      */
//     public void returnResource(final T resource) {
//         returnResourceObject(resource);
//     }
// 
//     /**
//      * 返回一个调用失败的对象到池中
//      * 
//      * @param resource
//      */
//     protected void returnBrokenResourceObject(final Object resource) {
//         try {
//             internalPool.invalidateObject(resource);
//         } catch (Exception e) {
//             throw new PbrpcException("Could not return the resource to the pool", e);
//         }
//     }
// 
//     /**
//      * 获取活跃的池中对象数量
//      * 
//      * @return
//      */
//     public int getNumActive() {
//         if (this.internalPool == null || this.internalPool.isClosed()) {
//             return -1;
//         }
// 
//         return this.internalPool.getNumActive();
//     }
// 
//     /**
//      * 获取暂时idle的对象数量
//      * 
//      * @return
//      */
//     public int getNumIdle() {
//         if (this.internalPool == null || this.internalPool.isClosed()) {
//             return -1;
//         }
//         return internalPool.getNumIdle();
//     }
// 
//     /**
//      * 销毁对象池
//      */
//     public void destroy() {
//         try {
//             internalPool.close();
//         } catch (Exception e) {
//             throw new PbrpcException("Could not destroy the pool", e);
//         }
//     }
// 
// }


// Path: src/main/java/com/baidu/beidou/navi/pbrpc/client/BlockingIOPbrpcClientSocketPool.java
import org.apache.commons.pool.impl.GenericObjectPool.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.baidu.beidou.navi.pbrpc.codec.Codec;
import com.baidu.beidou.navi.pbrpc.util.Pool;

package com.baidu.beidou.navi.pbrpc.client;



/**
 * ClassName: BlockingIOPbrpcClientSocketPool <br/>
 * Function: 客户端连接池，也叫做socket池，转为blocking io使用
 * 
 * @author Zhang Xu
 */
public class BlockingIOPbrpcClientSocketPool extends Pool<BlockingIOPbrpcClient> {

    private static final Logger LOG = LoggerFactory
            .getLogger(BlockingIOPbrpcClientSocketPool.class);