/*
* Copyright 2005,2006 WSO2, Inc. http://wso2.com
*
* 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 java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* The representation for Throttle - holds the both of runtime and static data.
* There is a one to one relationship between each throttle configuration and context.
* Currently support two type of throttle configuration. One is remote caller IP based and
* other one is remote caller domain name based.There may be a concurrent access controller,
* if the throttle policy has defined the maximum concurrent access .
*/
public class Throttle {
/* Holder for ThrottleContext - keeps all runtime data */
private Map throttleContexts;
/* Holder for ThrottleConfigurations - keeps all static data (data that
have extracted from the throttle policy) */
private Map throttleConfigurations;
/* ConcurrentAccessController instance- This is common to all remote callers
- controls the concurrent access through this throttle*/
private ConcurrentAccessController controller;
/* unique identifier for each throttle */
private String id;
/**
* Default Constructor - initiates the context and configuration maps
*/
public Throttle() {
this.throttleContexts = new ConcurrentHashMap();
this.throttleConfigurations = new ConcurrentHashMap();
}
/**
* Adds a ThrottleConfiguration with the given key - configuration
* holds all static data for registered callers
*
* @param key - corresponding key for throttle type.This key
* has one-one relationship with key of contexts
* @param throttleConfiguration - holds all static data for a throttle -
* ex: all callers configurations
*/
public void addThrottleConfiguration(String key, ThrottleConfiguration throttleConfiguration) {
this.throttleConfigurations.put(key, throttleConfiguration);
}
/**
* Adds a ThrotleContext with the given key - context holds all runtime data
* for registered callers
*
* @param key - corresponding key for throttle type.This key has one-one
* relationship with key of configurations
* @param throttleContext - holds runtime data - ex: all callers states
*/
public void addThrottleContext(String key, ThrottleContext throttleContext) {
this.throttleContexts.put(key, throttleContext);
}
/**
* Returns the ThrotleContext for a given key - context holds all
* runtime data for registered callers
*
* @param contextID - corresponding key for throttle type
* @return ThrottleContext returns the context that holds runtime data
* - ex: all callers state
*/
public ThrottleContext getThrottleContext(String contextID) {
return (ThrottleContext) this.throttleContexts.get(contextID);
}
/**
* Returns the ThrottleConfiguration for a given key -
* configuration holds all static data for registered callers
*
* @param key -corresponding key for throttle type
* @return ThrottleConfiguration Returns configuration that holds
* all static data for a throttle - ex: all callers configurations
*/
public ThrottleConfiguration getThrottleConfiguration(String key) {
return (ThrottleConfiguration) this.throttleConfigurations.get(key);
}
/**
* Sets the ConcurrentAccessController - this will control all the concurrent access
*
* @param controller - the ConcurrentAccessController instance
*/
public void setConcurrentAccessController(ConcurrentAccessController controller) {
this.controller = controller;
}
/**
* Returns the ConcurrentAccessController - this will control all the concurrent access
*
* @return the ConcurrentAccessController instance
*/
public ConcurrentAccessController getConcurrentAccessController() {
return this.controller;
}
/**
* Returns the unique identifier for this throttle
*
* @return String representation of the id
*/
public String getId() {
return this.id;
}
/**
* Sets the unique identifier for this throttle
*
* @param id String representation of the id
*/
public void setId(String id) {
if (id == null || "".equals(id)) {
throw new IllegalArgumentException("Invalid argument : ID cannot be null");
}
this.id = id.trim();
}
}