/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.impl.domainbase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.commons.throttle.core.CallerConfiguration;
import org.apache.synapse.commons.throttle.core.ThrottleConfiguration;
import org.apache.synapse.commons.throttle.core.ThrottleConstants;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Holds all the controlling policy parameter for all domain names
*/
public class DomainBaseThrottleConfiguration implements ThrottleConfiguration {
private static Log log = LogFactory.getLog(DomainBaseThrottleConfiguration.class.getName());
/* The key for "Other" configuration */
private String keyOfOther;
/* The default configuration for a throttle and this will apply to
callersMap that have not a custom configuration */
private CallerConfiguration defaultCallerConfiguration;
/* To hold configurations */
private Map configurationsMap;
public DomainBaseThrottleConfiguration() {
this.configurationsMap = new HashMap();
}
/**
* To get a DomainBaseCallerConfiguration - if a configuration for given key found ,it returns ,
* other wise , the default configuration will return.
*
* @param ID - The Remote caller id (domain name)
* @return Returns the corresponding configuration for the caller with given ID
*/
public CallerConfiguration getCallerConfiguration(String ID) {
if (ID.equals(ThrottleConstants.KEY_OF_DEFAULT_CONFIGURATION_FOR_OTHER)) {
return defaultCallerConfiguration;
} else {
String key = getConfigurationKeyOfCaller(ID);
if (key != null) {
if (key.equals(ThrottleConstants.KEY_OF_DEFAULT_CONFIGURATION_FOR_OTHER)) {
return defaultCallerConfiguration;
}
return (CallerConfiguration) configurationsMap.get(key);
}
}
return null;
}
/**
* To add a DomainBaseCallerConfiguration
*
* @param configuration - The configuration of the caller
*/
public void addCallerConfiguration(CallerConfiguration configuration) {
String key = configuration.getID();
if (key == null) {
return;
}
key = key.trim();
if (key.equals(ThrottleConstants.KEY_OF_DEFAULT_CONFIGURATION_FOR_OTHER)) {
keyOfOther = ThrottleConstants.KEY_OF_DEFAULT_CONFIGURATION_FOR_OTHER;
defaultCallerConfiguration = configuration;
} else {
configurationsMap.put(key, configuration);
}
}
/**
* To get key for caller configuration
* if there is a configuration with callerID , it returns
* otherwise ,
* on the first the ID contains one or more "." ,then recursively
* try to find the nearest root callerID.
* else if the ID doesn't contains ".", try to find a key with *.{ID} .
* Note : For valid ID , it should contain only zero or more "*." as a prefix.
* example:
* (if ID is a.a.a), check pattern *.a.a and a.a
* then *.*.a or *.a or a )
* if ID a then check start with *.a
*
* @param callerID The id of the remote caller (callerID name)
* @return String value -String representation of corrected epr-key for get configuration
*/
public String getConfigurationKeyOfCaller(String callerID) {
if (callerID != null) {
callerID = callerID.trim();
//if there is a unique Domain
if (configurationsMap.containsKey(callerID)) {
return callerID;
} else {
int index = callerID.indexOf(".");
if (index > 0) {
String rootDomain = callerID.substring(index + 1, callerID.length());
if (rootDomain != null) {
String all = "*." + rootDomain;
Set keyset = configurationsMap.keySet();
if (keyset != null && !keyset.isEmpty()) {
for (Iterator iter = keyset.iterator(); iter.hasNext(); ) {
String key = (String) iter.next();
if (key != null && key.endsWith(all)) {
return key;
}
}
}
return getConfigurationKeyOfCaller(rootDomain);
}
} else {
String all = "*." + callerID;
Set keyset = configurationsMap.keySet();
if (keyset != null && !keyset.isEmpty()) {
for (Iterator iter = keyset.iterator(); iter.hasNext(); ) {
String key = (String) iter.next();
if (key != null && key.endsWith(all)) {
return key;
}
}
}
}
}
}
return keyOfOther;
}
public int getType() {
return ThrottleConstants.DOMAIN_BASE;
}
public static void main(String[] args) {
new DomainBaseThrottleConfiguration().getCallerConfiguration("www.abc.co.uk");
}
}