// Path: ourea-core/src/main/java/com/taocoder/ourea/core/common/OureaException.java
// public class OureaException extends RuntimeException {
// 
//     public OureaException(String message) {
//         super(message);
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/model/Invocation.java
// public class Invocation implements Serializable {
// 
//     private static final long serialVersionUID = 3518301260123528398L;
// 
//     private String interfaceName;
// 
//     private String methodName;
// 
//     public Invocation() {
//     }
// 
//     public Invocation(String interfaceName, String methodName) {
//         this.interfaceName = interfaceName;
//         this.methodName = methodName;
//     }
// 
//     public String getInterfaceName() {
//         return interfaceName;
//     }
// 
//     public void setInterfaceName(String interfaceName) {
//         this.interfaceName = interfaceName;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o)
//             return true;
// 
//         if (o == null || getClass() != o.getClass())
//             return false;
// 
//         Invocation that = (Invocation) o;
// 
//         return new EqualsBuilder().append(interfaceName, that.interfaceName).append(methodName, that.methodName)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder(17, 37).append(interfaceName).append(methodName).toHashCode();
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/model/InvokeConn.java
// public class InvokeConn implements Serializable {
// 
//     private static final long serialVersionUID = -805739143582019252L;
// 
//     /**
//      * 服务端的信息ip+port
//      */
//     private ProviderInfo providerInfo;
// 
//     /**
//      * 和server端的连接池
//      */
//     private ObjectPool<TTransport> connPool;
// 
//     /**
//      * 连接池相关配置
//      */
//     private OureaObjectPoolConfig poolConfig;
// 
//     public InvokeConn(ProviderInfo providerInfo, int timeout) {
//         this(providerInfo, timeout, new OureaObjectPoolConfig());
//     }
// 
//     public InvokeConn(ProviderInfo providerInfo, int timeout, OureaObjectPoolConfig poolConfig) {
//         this.providerInfo = providerInfo;
//         this.poolConfig = poolConfig;
//         this.connPool = new GenericObjectPool<TTransport>(new ConsumerPoolFactory(providerInfo, timeout), poolConfig);
//     }
// 
//     public ProviderInfo getProviderInfo() {
//         return providerInfo;
//     }
// 
//     public void setProviderInfo(ProviderInfo providerInfo) {
//         this.providerInfo = providerInfo;
//     }
// 
//     public ObjectPool<TTransport> getConnPool() {
//         return connPool;
//     }
// 
//     public GenericObjectPoolConfig getPoolConfig() {
//         return poolConfig;
//     }
// 
//     public void setPoolConfig(OureaObjectPoolConfig poolConfig) {
//         this.poolConfig = poolConfig;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
// 
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         InvokeConn conn = (InvokeConn) o;
// 
//         return new EqualsBuilder()
//                 .append(providerInfo, conn.providerInfo)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder(17, 37)
//                 .append(providerInfo)
//                 .toHashCode();
//     }
// }


import com.taocoder.ourea.core.common.OureaException;
import com.taocoder.ourea.core.model.Invocation;
import com.taocoder.ourea.core.model.InvokeConn;
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
/*
 * Copyright (c) 2015 ketao1989.github.com. All Rights Reserved.
 */
package com.taocoder.ourea.core.loadbalance;



/**
 * @author tao.ke Date: 16/3/3 Time: 下午3:17
 */
public abstract class AbstractLoadBalanceStrategy implements ILoadBalanceStrategy {

    @Override
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/common/OureaException.java
// public class OureaException extends RuntimeException {
// 
//     public OureaException(String message) {
//         super(message);
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/model/Invocation.java
// public class Invocation implements Serializable {
// 
//     private static final long serialVersionUID = 3518301260123528398L;
// 
//     private String interfaceName;
// 
//     private String methodName;
// 
//     public Invocation() {
//     }
// 
//     public Invocation(String interfaceName, String methodName) {
//         this.interfaceName = interfaceName;
//         this.methodName = methodName;
//     }
// 
//     public String getInterfaceName() {
//         return interfaceName;
//     }
// 
//     public void setInterfaceName(String interfaceName) {
//         this.interfaceName = interfaceName;
//     }
// 
//     public String getMethodName() {
//         return methodName;
//     }
// 
//     public void setMethodName(String methodName) {
//         this.methodName = methodName;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o)
//             return true;
// 
//         if (o == null || getClass() != o.getClass())
//             return false;
// 
//         Invocation that = (Invocation) o;
// 
//         return new EqualsBuilder().append(interfaceName, that.interfaceName).append(methodName, that.methodName)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder(17, 37).append(interfaceName).append(methodName).toHashCode();
//     }
// }
// 
// Path: ourea-core/src/main/java/com/taocoder/ourea/core/model/InvokeConn.java
// public class InvokeConn implements Serializable {
// 
//     private static final long serialVersionUID = -805739143582019252L;
// 
//     /**
//      * 服务端的信息ip+port
//      */
//     private ProviderInfo providerInfo;
// 
//     /**
//      * 和server端的连接池
//      */
//     private ObjectPool<TTransport> connPool;
// 
//     /**
//      * 连接池相关配置
//      */
//     private OureaObjectPoolConfig poolConfig;
// 
//     public InvokeConn(ProviderInfo providerInfo, int timeout) {
//         this(providerInfo, timeout, new OureaObjectPoolConfig());
//     }
// 
//     public InvokeConn(ProviderInfo providerInfo, int timeout, OureaObjectPoolConfig poolConfig) {
//         this.providerInfo = providerInfo;
//         this.poolConfig = poolConfig;
//         this.connPool = new GenericObjectPool<TTransport>(new ConsumerPoolFactory(providerInfo, timeout), poolConfig);
//     }
// 
//     public ProviderInfo getProviderInfo() {
//         return providerInfo;
//     }
// 
//     public void setProviderInfo(ProviderInfo providerInfo) {
//         this.providerInfo = providerInfo;
//     }
// 
//     public ObjectPool<TTransport> getConnPool() {
//         return connPool;
//     }
// 
//     public GenericObjectPoolConfig getPoolConfig() {
//         return poolConfig;
//     }
// 
//     public void setPoolConfig(OureaObjectPoolConfig poolConfig) {
//         this.poolConfig = poolConfig;
//     }
// 
//     @Override
//     public boolean equals(Object o) {
//         if (this == o) return true;
// 
//         if (o == null || getClass() != o.getClass()) return false;
// 
//         InvokeConn conn = (InvokeConn) o;
// 
//         return new EqualsBuilder()
//                 .append(providerInfo, conn.providerInfo)
//                 .isEquals();
//     }
// 
//     @Override
//     public int hashCode() {
//         return new HashCodeBuilder(17, 37)
//                 .append(providerInfo)
//                 .toHashCode();
//     }
// }


// Path: ourea-core/src/main/java/com/taocoder/ourea/core/loadbalance/AbstractLoadBalanceStrategy.java
import com.taocoder.ourea.core.common.OureaException;
import com.taocoder.ourea.core.model.Invocation;
import com.taocoder.ourea.core.model.InvokeConn;
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;

/*
 * Copyright (c) 2015 ketao1989.github.com. All Rights Reserved.
 */
package com.taocoder.ourea.core.loadbalance;



/**
 * @author tao.ke Date: 16/3/3 Time: 下午3:17
 */
public abstract class AbstractLoadBalanceStrategy implements ILoadBalanceStrategy {

    @Override
    public InvokeConn select(List<InvokeConn> invokeConns, Invocation invocation) {