# ThrottleUtil.java

    /*
    *  Copyright (c) 2005-2012, 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.apache.synapse.commons.throttle.core;

    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    import javax.cache.Cache;
    import javax.cache.CacheManager;
    import javax.cache.Caching;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Properties;

    public class ThrottleUtil {
        private static Log log = LogFactory.getLog(ThrottleUtil.class.getName());

        public static final String THROTTLING_CACHE_MANAGER = "throttling.cache.manager";

    	private static final String CONF_LOCATION = "conf.location";

        public static final String THROTTLING_CACHE = "throttling.cache";

    	/**
    	 * This method used to set throttle properties loaded from throttle.properties file in configuration folder
    	 * @return properties of throttle properties
    	 */
    	public static ThrottleProperties loadThrottlePropertiesFromConfigurations() {
    		ThrottleProperties throttleProperties = new ThrottleProperties();
    		Properties properties = new Properties();
    		String throttlePropertiesFileLocation = null;
    		if (System.getProperty(CONF_LOCATION) != null) {
    			throttlePropertiesFileLocation = System.getProperty(CONF_LOCATION) + File.separator +"throttle.properties";
    			try {
    				properties.load(new FileInputStream(throttlePropertiesFileLocation));
    				String throttleFrequency =
    						properties.getProperty(ThrottleConstants.THROTTLE_CONTEXT_CLEANUP_TASK_FREQUENCY);
    				if (!StringUtils.isEmpty(throttleFrequency)) {
    					throttleProperties.setThrottleFrequency(throttleFrequency);
    				} else {
    					throttleProperties.setThrottleFrequency("3600000");
    				}

    				String throttleContextDistributedCleanupTaskFrequency =
    						properties.getProperty(ThrottleConstants.THROTTLE_CONTEXT_DISTRIBUTED_CLEANUP_TASK_FREQUENCY);
    				if (throttleContextDistributedCleanupTaskFrequency != null &&
    				    throttleContextDistributedCleanupTaskFrequency != "") {
    					throttleProperties.setThrottleContextDistributedCleanupTaskFrequency(
    							throttleContextDistributedCleanupTaskFrequency);
    				} else {
    					throttleProperties.setThrottleContextDistributedCleanupTaskFrequency("3600000");
    				}

    				String throttleContextDistributedExpiredInstanceTime =
    						properties.getProperty(ThrottleConstants.THROTTLE_CONTEXT_DISTRIBUTED_EXPIRED_INSTANCE_TIME);
    				if (throttleContextDistributedExpiredInstanceTime != null &&
    				    throttleContextDistributedExpiredInstanceTime != "") {
    					throttleProperties.setThrottleContextDistributedExpiredInstanceTime(
    							throttleContextDistributedExpiredInstanceTime);
    				} else {
    					throttleProperties.setThrottleContextDistributedExpiredInstanceTime("3600000");
    				}
    				String throttleDistributedCleanupPoolSize =
    						properties.getProperty(ThrottleConstants.THROTTLE_DISTRIBUTED_CLEANUP_POOL_SIZE);
    				if (throttleDistributedCleanupPoolSize != null && throttleDistributedCleanupPoolSize != "") {
    					throttleProperties.setThrottleDistributedCleanupPoolSize(
    							throttleDistributedCleanupPoolSize);
    				} else {
    					throttleProperties.setThrottleDistributedCleanupPoolSize("1");
    				}

    				String throttleDistributedCleanupAmount =
    						properties.getProperty(ThrottleConstants.THROTTLE_DISTRIBUTED_CLEANUP_AMOUNT);
    				if (throttleDistributedCleanupAmount != null && throttleDistributedCleanupAmount != "") {
    					throttleProperties.setThrottleDistributedCleanupAmount(
    							throttleDistributedCleanupAmount);
    				} else {
    					throttleProperties.setThrottleDistributedCleanupAmount("25000");
    				}

    				String throttleDistributedCleanupTaskEnable =
    						properties.getProperty(ThrottleConstants.THROTTLE_DISTRIBUTED_CLEANUP_TASK_ENABLE);
    				if (throttleDistributedCleanupTaskEnable != null && throttleDistributedCleanupTaskEnable != "") {
    					throttleProperties.setThrottleDistributedCleanupTaskEnable(
    							throttleDistributedCleanupTaskEnable);
    				} else {
    					throttleProperties.setThrottleDistributedCleanupTaskEnable("true");
    				}

    				String maxNonAssociatedCounterCleanupAmount =
    						properties.getProperty(ThrottleConstants.MAX_NON_ASSOCIATED_COUNTER_CLEANUP_AMOUNT);
    				if (maxNonAssociatedCounterCleanupAmount != null && maxNonAssociatedCounterCleanupAmount != "") {
    					throttleProperties.setMaxNonAssociatedCounterCleanupAmount(
    							maxNonAssociatedCounterCleanupAmount);
    				} else {
    					throttleProperties.setMaxNonAssociatedCounterCleanupAmount("25000");
    				}

    				String throttlingPoolSize =
    						properties.getProperty(ThrottleConstants.THROTTLING_POOL_SIZE);
    				if (throttlingPoolSize != null && throttlingPoolSize != "") {
    					throttleProperties.setThrottlingPoolSize(
    							throttlingPoolSize);
    				} else {
    					throttleProperties.setThrottlingPoolSize("1");
    				}
    				String throttlingReplicationFrequency =
    						properties.getProperty(ThrottleConstants.THROTTLING_REPLICATION_FREQUENCY);
    				if (throttlingReplicationFrequency != null && throttlingReplicationFrequency != "" ) {
    					throttleProperties.setThrottlingReplicationFrequency(
    							throttlingReplicationFrequency);
    				} else {
    					throttleProperties.setThrottlingReplicationFrequency("50");
    				}

    				String throttlingKeysToReplicate =
    						properties.getProperty(ThrottleConstants.THROTTLING_KEYS_TO_REPLICATE);
    				if (throttlingKeysToReplicate != null && throttlingKeysToReplicate != "") {
    					throttleProperties.setThrottlingKeysToReplicates(
    							throttlingKeysToReplicate);
    				} else {
    					throttleProperties.setThrottlingKeysToReplicates("25000");
    				}

    				String windowReplicatorPoolSize =
    						properties.getProperty(ThrottleConstants.WINDOW_REPLICATOR_POOL_SIZE);
    				if (windowReplicatorPoolSize != null && windowReplicatorPoolSize != "") {
    					throttleProperties.setWindowReplicatorPoolSize(
    							windowReplicatorPoolSize);
    				} else {
    					throttleProperties.setWindowReplicatorPoolSize("1");
    				}

    				String windowReplicatorFrequency =
    						properties.getProperty(ThrottleConstants.WINDOW_REPLICATOR_FREQUENCY);
    				if (windowReplicatorFrequency != null && windowReplicatorFrequency != "") {
    					throttleProperties.setWindowReplicatorFrequency(
    							windowReplicatorFrequency);
    				} else {
    					throttleProperties.setWindowReplicatorFrequency("50");
    				}

    			} catch (IOException e) {
    				log.debug("Setting the Default Throttle Properties");
    				throttleProperties.setThrottleFrequency("3600000");
    				throttleProperties.setThrottleContextDistributedCleanupTaskFrequency("3600000");
    				throttleProperties.setThrottleContextDistributedExpiredInstanceTime("3600000");
    				throttleProperties.setThrottleDistributedCleanupPoolSize("1");
    				throttleProperties.setThrottleDistributedCleanupAmount("25000");
    				throttleProperties.setThrottleDistributedCleanupTaskEnable("true");
    				throttleProperties.setMaxNonAssociatedCounterCleanupAmount("25000");
    				throttleProperties.setThrottlingPoolSize("1");
    				throttleProperties.setThrottlingReplicationFrequency("50");
    				throttleProperties.setThrottlingKeysToReplicates("25000");
    				throttleProperties.setWindowReplicatorPoolSize("1");
    				throttleProperties.setWindowReplicatorFrequency("50");
    			}
    		}else{
    			log.debug("Setting the Default Throttle Properties");
    			throttleProperties.setThrottleFrequency("3600000");
    			throttleProperties.setThrottleContextDistributedCleanupTaskFrequency("3600000");
    			throttleProperties.setThrottleContextDistributedExpiredInstanceTime("3600000");
    			throttleProperties.setThrottleDistributedCleanupPoolSize("1");
    			throttleProperties.setThrottleDistributedCleanupAmount("25000");
    			throttleProperties.setThrottleDistributedCleanupTaskEnable("true");
    			throttleProperties.setMaxNonAssociatedCounterCleanupAmount("25000");
    			throttleProperties.setThrottlingPoolSize("1");
    			throttleProperties.setThrottlingReplicationFrequency("50");
    			throttleProperties.setThrottlingKeysToReplicates("25000");
    			throttleProperties.setWindowReplicatorPoolSize("1");
    			throttleProperties.setWindowReplicatorFrequency("50");
    		}

    		return throttleProperties;

    	}
        public static Cache<String, CallerContext> getThrottleCache() {
            // acquiring  cache manager.
            Cache<String, CallerContext> cache;
            CacheManager cacheManager = Caching.getCacheManagerFactory().
                    getCacheManager(THROTTLING_CACHE_MANAGER);
            if (cacheManager != null) {
                cache = cacheManager.getCache(THROTTLING_CACHE);
            } else {
                cache = Caching.getCacheManager().getCache(THROTTLING_CACHE);
            }
            if (log.isDebugEnabled()) {
                log.debug("created throttling cache : " + cache);
            }
            return cache;
        }
    }