/*
*  Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. licenses this file to you under the Apache License,
*  Version 2.0 (the "License"); you may not use this file except
*  in compliance with the License.
*  You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.wso2.carbon.databridge.agent.client;

import org.apache.commons.pool.impl.GenericKeyedObjectPool;

/**
 * This class is used hold the secure/non-secure connections for an Agent.
 */

public class ClientPool {
    private GenericKeyedObjectPool socketPool;
    private GenericKeyedObjectPool secureSocketPool;

    public GenericKeyedObjectPool getClientPool(AbstractClientPoolFactory factory,
                                                int maxActive,
                                                int maxIdle,
                                                boolean testOnBorrow,
                                                long timeBetweenEvictionRunsMillis,
                                                long minEvictableIdleTimeMillis) {
        if (socketPool == null) {
            synchronized (this) {
                if (socketPool == null) {
                    socketPool = new GenericKeyedObjectPool();
                    socketPool.setFactory(factory);
                    socketPool.setMaxActive(maxActive);
                    socketPool.setTestOnBorrow(testOnBorrow);
                    socketPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
                    socketPool.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
                    socketPool.setMaxIdle(maxIdle);
                    socketPool.setWhenExhaustedAction(GenericKeyedObjectPool.WHEN_EXHAUSTED_GROW);
                }
            }
        }
        return socketPool;
    }

    public GenericKeyedObjectPool getClientPool(AbstractSecureClientPoolFactory factory,
                                                int maxActive,
                                                int maxIdle,
                                                boolean testOnBorrow,
                                                long timeBetweenEvictionRunsMillis,
                                                long minEvictableIdleTimeMillis) {
        if (secureSocketPool == null) {
            synchronized (this) {
                if (secureSocketPool == null) {
                    secureSocketPool = new GenericKeyedObjectPool();
                    secureSocketPool.setFactory(factory);
                    secureSocketPool.setMaxActive(maxActive);
                    secureSocketPool.setTestOnBorrow(testOnBorrow);
                    secureSocketPool.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
                    secureSocketPool.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
                    secureSocketPool.setMaxIdle(maxIdle);
                    secureSocketPool.setWhenExhaustedAction(GenericKeyedObjectPool.WHEN_EXHAUSTED_BLOCK);
                }
            }
        }
        return secureSocketPool;
    }
}
