/*
* Copyright 2005,2006 WSO2, Inc. http://www.wso2.org
*
* Licensed 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 javax.xml.namespace.QName;

public final class ThrottleConstants {

    public static final String HAZELCAST = "hazelcast";

    private ThrottleConstants() {

    }

    /* Throttle module name */

    public static final String THROTTLE_MODULE_NAME = "wso2throttle";

    /* Throttle namespace */

    public static final String THROTTLE_NS = "http://www.wso2.org/products/wso2commons/throttle";

    public static final String THROTTLE_NS_PREFIX = "throttle";

    /* Throttle type according to the caller type eg: ip | domain */

    public static final int IP_BASE = 0;

    public static final int DOMAIN_BASE = 1;

    public static final int ROLE_BASE = 2;

    /* Throttle type according to the scope ex : service level;,operation level and module level*/

    public static final int GLOBAL_THROTTLE = 0;

    public static final int SERVICE_BASED_THROTTLE = 1;

    public static final int OPERATION_BASED_THROTTLE = 2;

    /* The throttle policy parameters */
    /**
     * @deprecated
     */
    public static final QName THROTTLE_ASSERTION_QNAME =
            new QName(THROTTLE_NS, "ThrottleAssertion", THROTTLE_NS_PREFIX);

    public static final QName OPERATION_THROTTLE_ASSERTION_QNAME =
            new QName(THROTTLE_NS, "OperationThrottleAssertion", THROTTLE_NS_PREFIX);

    public static final QName SERVICE_THROTTLE_ASSERTION_QNAME =
            new QName(THROTTLE_NS, "ServiceThrottleAssertion", THROTTLE_NS_PREFIX);

    public static final QName MODULE_THROTTLE_ASSERTION_QNAME =
            new QName(THROTTLE_NS, "ModuleThrottleAssertion", THROTTLE_NS_PREFIX);

    public static final QName MEDIATOR_THROTTLE_ASSERTION_QNAME =
            new QName(THROTTLE_NS, "MediatorThrottleAssertion", THROTTLE_NS_PREFIX);


    public static final QName THROTTLE_TYPE_ATTRIBUTE_QNAME =
            new QName(THROTTLE_NS, "type", THROTTLE_NS_PREFIX);

    public static final String KEY_OF_DEFAULT_CONFIGURATION_FOR_OTHER = "other";

    /**
     * @deprecated
     */
    public static final String ISALLOW_PARAMETER_NAME = "IsAllow";

    public static final String ALLOW_PARAMETER_NAME = "Allow";

    public static final String CONTROL_PARAMETER_NAME = "Control";

    public static final String DENY_PARAMETER_NAME = "Deny";

    public static final String DEFAULT_THROTTLE_CONTEXT_ID = "ThrottleContextID";

    public static final String UNIT_TIME_PARAMETER_NAME = "UnitTime";

    public static final String MAXIMUM_COUNT_PARAMETER_NAME = "MaximumCount";

    public static final String PROHIBIT_TIME_PERIOD_PARAMETER_NAME = "ProhibitTimePeriod";

    public static final String ID_PARAMETER_NAME = "ID";

    public static final String MAXIMUM_CONCURRENT_ACCESS_PARAMETER_NAME = "MaximumConcurrentAccess";

    /**
     * This global throttle path can be used to point to an external global throttle policy using
     * the axis.xml
     */
    public static final String GLOBAL_THROTTLE_PATH_PARAM = "globalThrottlePolicyPath";

    /* Access states  - allow, deny or control */

    public static final int ACCESS_CONTROLLED = 0;

    public static final int ACCESS_DENIED = 1;

    public static final int ACCESS_ALLOWED = 2;

    /* The default clean up time indicates how often cleaning up process should execute  */

    public static final long DEFAULT_THROTTLE_CLEAN_PERIOD = 5 * 1000 * 60;

    /*prefix for throttle specific properties */

    public static final String THROTTLE_PROPERTY_PREFIX = "throttle_";

    /*The key for map that contains all available throttles */

    public static final String THROTTLES_MAP = "local_throttle_map";

    /* The key for looking up throttle context and configuration from the throttle
    ,according to the type (ip | domain) */

    public static final String IP_BASED_THROTTLE_KEY = "key_of_ip_based_throttle";

    public static final String DOMAIN_BASED_THROTTLE_KEY = "key_of_domain_based_throttle";

    public static final String ROLE_BASED_THROTTLE_KEY = "key_of_role_based_throttle";

    public static final String TOKEN_BASED_THROTTLE_KEY = "key_of_token_based_throttle";

    /* The key for level throttle */

    public static final String GLOBAL_THROTTLE_KEY = "key_of_global_throttle";

    /* suffix for key , when setting a concurrent access controller to context */

    public static final String CAC_SUFFIX = "_cac_key";

    /* the throttle id for module level throttle */

    public static final String GLOBAL_THROTTLE_ID = "id_of_global_throttle_";

    /**
     * Parameter names which are used to identify special services..
     */
    public static final String ADMIN_SERVICE_PARAM_NAME = "adminService";
    public static final String HIDDEN_SERVICE_PARAM_NAME = "hiddenService";
    public static final String DYNAMIC_SERVICE_PARAM_NAME = "dynamicService";

    public static final String DOMAIN_NAME_PROPERTY = "domainName";

    /**
     * Dummy token for token based throttling policy initialization
     */
    public static final String DUMMY_TOKEN = "dummy_token_for_token_based_throttle";

    public static final String THROTTLE_INFO_KEY = "throttle_info";

    public static final String THROTTLE_TIMESTAMP_KEY = "startedTime-";
    public static final String THROTTLE_SHARED_COUNTER_KEY = "sharedCounter-";
    public static final String THROTTLE_LOCK_KEY_PREFIX = "lock-";
    public static final String THROTTLE_CONTEXT_CLEANUP_TASK_FREQUENCY = "throttling.context.cleanup.frequency";
    public static final String THROTTLE_CONTEXT_DISTRIBUTED_CLEANUP_TASK_FREQUENCY =
            "throttling.context.distributed.cleanup.frequency";
    public static final String THROTTLE_CONTEXT_DISTRIBUTED_EXPIRED_INSTANCE_TIME =
            "throttling.context.distributed.expired.instance.time";
    public static final String THROTTLE_DISTRIBUTED_CLEANUP_POOL_SIZE =
            "throttling.context.distributed.cleanup.pool.size";
    public static final String THROTTLE_DISTRIBUTED_CLEANUP_AMOUNT = "throttling.context.distributed.cleanup.amount";
    public static final String MAX_NON_ASSOCIATED_COUNTER_CLEANUP_AMOUNT = "stale.counter.references";
    public static final String THROTTLE_DISTRIBUTED_CLEANUP_TASK_ENABLE =
            "throttling.context.distributed.cleanup.task.enabled";
    public static final String THROTTLING_POOL_SIZE = "throttling.pool.size";
    public static final String THROTTLING_REPLICATION_FREQUENCY = "throttling.replication.frequency";
    public static final String THROTTLING_KEYS_TO_REPLICATE = "throttling.keys.to.replicate";
    public static final String WINDOW_REPLICATOR_POOL_SIZE = "throttlingWindowReplicator.pool.size";
    public static final String WINDOW_REPLICATOR_FREQUENCY = "throttlingWindowReplicator.replication.frequency";
    public static final String UNIFIED_THROTTLE_REPLICATOR_ENABLED = "throttling.unified_replicator.enable";
    public static final String THROTTLE_WINDOW_HASH_KEY = "throttle_window:";
    public static final String THROTTLE_WINDOW_LOCK_KEY = "throttle_window_lock:";
    public static final String DISTRIBUTED_COUNTER_TYPE = "throttling.distributed.counter.type";
    public static final String DISTRIBUTED_COUNTER_CONFIGURATIONS  = "throttling.distributed.counter.configurations.";
    public static final String THROTTLE_SYNC_ASYNC_HYBRID_MODE_ENABLED = "throttling.sync-async_hybrid_mode.enable";
    public static final String HYBRID_THROTTLE_PROCESSOR_WINDOW_TYPE = "throttling.hybrid_throttle_processor_window.type";
    public static final String LOCAL_QUOTA_BUFFER_PERCENTAGE = "throttling.local_quota_buffer_percentage";
}
