You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by la...@apache.org on 2013/06/28 21:27:28 UTC
[44/51] [partial] initial commit to apache incubator. Here just
commit WSO2 Stratos code base as it is. After that will start re-factor code
to apache
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/LoadBalancerConfiguration.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/LoadBalancerConfiguration.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/LoadBalancerConfiguration.java
new file mode 100644
index 0000000..f5aae03
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/LoadBalancerConfiguration.java
@@ -0,0 +1,1205 @@
+/*
+* Copyright (c) 2005-2011, 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.lb.common.conf;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.commons.util.PropertyHelper;
+import org.wso2.carbon.lb.common.conf.structure.Node;
+import org.wso2.carbon.lb.common.conf.structure.NodeBuilder;
+import org.wso2.carbon.lb.common.conf.util.Constants;
+import org.wso2.carbon.lb.common.conf.util.HostContext;
+import org.wso2.carbon.lb.common.conf.util.LoadBalancerConfigUtil;
+import org.wso2.carbon.lb.common.conf.util.TenantDomainContext;
+import java.io.*;
+import java.net.URL;
+import java.util.*;
+
+/**
+ * Data object which hold configuration data of the load analyzer task
+ */
+@SuppressWarnings("unused")
+public class LoadBalancerConfiguration implements Serializable {
+
+ protected static final long serialVersionUID = -5553545217542808233L;
+
+ private static final Log log = LogFactory.getLog(LoadBalancerConfiguration.class);
+
+ /**
+ * This map is there to speed up the lookup time.
+ * Key: domain
+ * <p/>
+ * Value: A map whose key is sub domain and value is ServiceConfiguration
+ */
+ private Map<String, Map<String, ServiceConfiguration>> serviceConfigurations =
+ new HashMap<String, Map<String, ServiceConfiguration>>();
+
+ /**
+ * Key - host name
+ * Value - {@link HostContext}
+ */
+ private transient Map<String, HostContext> hostCtxt = new HashMap<String, HostContext>();
+
+ /**
+ * This map is there to speed up the lookup time.
+ * Key: service name/cartridge type (Stratos2). NOTE: that this is not the service cluster domain.
+ * Value: list of {@link ServiceConfiguration} - corresponding objects under a service name.
+ */
+ private Map<String, List<ServiceConfiguration>> serviceNameToServiceConfigurations =
+ new HashMap<String, List<ServiceConfiguration>>();
+
+ /**
+ * This list will be used to identify host name duplications among different services.
+ * Within a service there can be duplications, but among different services you can't have duplications.
+ * Key - service name
+ * Value - hosts under the respective service.
+ */
+ private Map<String, Set<String>> hostNamesTracker = new HashMap<String, Set<String>>();
+
+ protected ServiceConfiguration defaultServiceConfig;
+ protected LBConfiguration lbConfig;
+
+ /**
+ * LBConfig file as a String
+ */
+ protected String lbConfigString;
+
+ /**
+ * Root node object for loadbalancer.conf
+ */
+ protected Node rootNode;
+
+ private LoadBalancerConfiguration(){
+ init(System.getProperty("loadbalancer.conf"));
+ }
+
+ private static LoadBalancerConfiguration instance ;
+
+ public static LoadBalancerConfiguration getInstance(){
+ if(instance == null){
+ instance = new LoadBalancerConfiguration();
+ }
+ return instance;
+ }
+
+ /**
+ * Sample loadbalancer.conf:
+ * <p/>
+ * loadbalancer {
+ * # minimum number of load balancer instances
+ * instances 1;
+ * # whether autoscaling enable or not
+ * enable_autoscaler true;
+ * # End point reference of the Autoscaler Service
+ * autoscaler_service_epr https://10.100.3.81:9443/services/AutoscalerService/;
+ * # interval between two task executions in milliseconds
+ * autoscaler_task_interval 1000;
+ * # after an instance booted up, task will wait till this much of time and let the server started up
+ * server_startup_delay 15000;
+ * }
+ * <p/>
+ * services {
+ * defaults {
+ * min_app_instances 1;
+ * max_app_instances 5;
+ * queue_length_per_node 400;
+ * rounds_to_average 10;
+ * instances_per_scale_up 1;
+ * message_expiry_time 60000;
+ * }
+ * <p/>
+ * appserver {
+ * hosts appserver.cloud-test.wso2.com,as.cloud-test.wso2.com;
+ * domains {
+ * wso2.as1.domain {
+ * tenant_range 1-100;
+ * }
+ * wso2.as2.domain {
+ * tenant_range 101-200;
+ * }
+ * wso2.as3.domain {
+ * tenant_range *;
+ * }
+ * }
+ * }
+ * }
+ *
+ * @param configURL URL of the load balancer config
+ */
+ public void init(String configURL) {
+
+ if(configURL == null){
+ String msg = "Cannot locate the location of the loadbalancer.conf file." +
+ " You need to set the 'loadbalancer.conf' system property.";
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ if (configURL.startsWith("$system:")) {
+ configURL = System.getProperty(configURL.substring("$system:".length()));
+ }
+
+ try {
+
+ // get loadbalancer.conf file as a String
+ if (configURL.startsWith(File.separator)) {
+ lbConfigString = createLBConfigString(configURL);
+ } else {
+ lbConfigString = createLBConfigString(new URL(configURL).openStream());
+ }
+
+ } catch (Exception e) {
+ String msg = "Cannot read configuration file from " + configURL;
+ log.error(msg, e);
+ throw new RuntimeException(msg, e);
+ }
+
+ // build a Node object for whole loadbalancer.conf
+ rootNode = new Node();
+ rootNode.setName("root");
+ rootNode = NodeBuilder.buildNode(rootNode, lbConfigString);
+
+ // load 'loadbalancer' node
+ Node lbConfigNode = rootNode.findChildNodeByName(Constants.LOAD_BALANCER_ELEMENT);
+
+ if(lbConfigNode != null){
+ createConfiguration(lbConfig = new LBConfiguration(), lbConfigNode);
+ }
+
+ // load services node
+ Node servicesConfigNode = rootNode.findChildNodeByName(Constants.SERVICES_ELEMENT);
+
+ if (servicesConfigNode == null) {
+ String msg = "Mandatory " + Constants.SERVICES_ELEMENT +
+ " element can not be found in the configuration file.";
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ // Set services configuration
+ createServicesConfig(servicesConfigNode);
+
+ }
+
+
+ /**
+ * Process the content of the following 'services' element
+ * <p/>
+ * services {
+ * defaults {
+ * min_app_instances 1;
+ * max_app_instances 5;
+ * queue_length_per_node 400;
+ * rounds_to_average 10;
+ * instances_per_scale_up 1;
+ * message_expiry_time 60000;
+ * }
+ * <p/>
+ * appserver {
+ * hosts appserver.cloud-test.wso2.com,as.cloud-test.wso2.com;
+ * domains {
+ * wso2.as1.domain {
+ * tenant_range 1-100;
+ * }
+ * wso2.as2.domain {
+ * tenant_range 101-200;
+ * }
+ * wso2.as3.domain {
+ * tenant_range *;
+ * }
+ * }
+ * }
+ * }
+ *
+ * @param servicesConfigNode services element's Node
+ */
+ public List<ServiceConfiguration> createServicesConfig(Node servicesConfigNode) {
+
+ // current list of service configs
+ List<ServiceConfiguration> currentServiceConfigs = new ArrayList<ServiceConfiguration>();
+
+ // Building default configuration
+ Node defaultNode = servicesConfigNode.findChildNodeByName(Constants.DEFAULTS_ELEMENT);
+
+ if (defaultNode != null) {
+
+ createConfiguration(defaultServiceConfig = new ServiceConfiguration(), defaultNode);
+ }
+
+ // Building custom services configuration
+ for (Node serviceNode : servicesConfigNode.getChildNodes()) {
+ //skip default node
+ if (serviceNode != defaultNode) {
+
+ String serviceName = serviceNode.getName();
+
+ // reading domains
+
+ Node domainsNode;
+
+ if (serviceNode.getChildNodes().isEmpty() ||
+ !(domainsNode = serviceNode.getChildNodes().get(0)).getName().equals(
+ Constants.DOMAIN_ELEMENT)) {
+
+ String msg = "The mandatory domains element, child of the " + serviceName +
+ " element is not specified in the configuration file. \n"+
+ serviceNode.toString();
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ if (domainsNode.getChildNodes().isEmpty()) {
+ // this is probably a mistake, so we don't proceed
+ String msg = "No domain is specified under " + Constants.DOMAIN_ELEMENT +
+ " of " + serviceName + " element.";
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ ServiceConfiguration serviceConfig;
+
+ // iterates through all the service domain specified in this service element.
+ for (Node domain : domainsNode.getChildNodes()) {
+
+ // create a new service configuration
+ serviceConfig = new ServiceConfiguration();
+
+ // set service name
+ serviceConfig.setServiceName(serviceName);
+
+ // set domain name
+ serviceConfig.setDomain(domain.getName());
+
+ // let's set properties common to all domains specified in this service element.
+ createConfiguration(serviceConfig, serviceNode);
+
+ // load properties specified under this service domain element.
+ createConfiguration(serviceConfig, domain);
+
+ // check host name duplication
+ if(isDuplicatedHost(serviceNode.getName(), serviceConfig)){
+ // this is probably a mistake, so we don't proceed
+ String msg = "Duplicated host names detected for different service domains.\n" +
+ "Element: \n"+serviceNode.toString();
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ currentServiceConfigs.add(serviceConfig);
+
+ }
+ }
+ }
+
+ for (ServiceConfiguration serviceConfiguration : currentServiceConfigs) {
+
+ // add the built ServiceConfiguration, to the map
+ addServiceConfiguration(serviceConfiguration);
+
+ }
+
+ return currentServiceConfigs;
+
+ }
+
+
+ public boolean addServiceConfiguration(ServiceConfiguration serviceConfig) {
+
+ Map<String, ServiceConfiguration> map;
+ String domain = serviceConfig.getDomain();
+
+ if(domain == null){
+ String msg = "Domain of a Service Configuration cannot be null. Hence this " +
+ "Configuration will be neglected.";
+ log.error(msg);
+ return false;
+ }
+
+ String subDomain = serviceConfig.getSubDomain();
+
+ if (serviceConfigurations.containsKey(domain)) {
+ map = serviceConfigurations.get(domain);
+ } else {
+ map = new HashMap<String, ServiceConfiguration>();
+ }
+ // put this serviceConfig
+ map.put(subDomain, serviceConfig);
+
+ // update the parent map
+ serviceConfigurations.put(domain, map);
+
+ // add to serviceNameToServiceConfiguration map
+ List<ServiceConfiguration> configs;
+ if(serviceNameToServiceConfigurations.get(serviceConfig.getServiceName()) == null){
+ configs = new ArrayList<ServiceConfiguration>();
+
+ }else{
+ configs = serviceNameToServiceConfigurations.get(serviceConfig.getServiceName());
+ }
+
+ if(!configs.contains(serviceConfig)){
+ configs.add(serviceConfig);
+ }
+ serviceNameToServiceConfigurations.put(serviceConfig.getServiceName(), configs);
+
+ return true;
+ }
+
+ public ServiceConfiguration removeServiceConfiguration(String domain, String subDomain) {
+
+ Map<String, ServiceConfiguration> map;
+ ServiceConfiguration serviceConfig = null;
+
+ if(domain == null){
+ String msg = "Domain of a Service Configuration cannot be null. Hence this " +
+ "Configuration will be neglected.";
+ log.error(msg);
+ return null;
+ }
+
+ if (serviceConfigurations.containsKey(domain)) {
+ map = serviceConfigurations.get(domain);
+
+ if(map != null){
+ serviceConfig = map.remove(subDomain);
+ }
+ }
+
+ if(serviceConfig == null){
+ String msg = "No matching service configuration found for domain: "+domain+
+ ", sub domain: "+subDomain;
+ log.error(msg);
+ return null;
+ }
+
+ String serviceName = serviceConfig.getServiceName();
+
+ if (serviceName != null && serviceNameToServiceConfigurations.containsKey(serviceName)) {
+ if(serviceConfig != null){
+ List<ServiceConfiguration> list = serviceNameToServiceConfigurations.get(serviceName);
+
+ list.remove(serviceConfig);
+
+ serviceNameToServiceConfigurations.put(serviceName, list);
+ }
+ }
+
+ Set<String> allHosts;
+
+ if (hostNamesTracker.containsKey(serviceName)) {
+ allHosts = hostNamesTracker.get(serviceName);
+
+ for (String hostName : serviceConfig.getHosts()) {
+
+ if (hostName != null) {
+
+ allHosts.remove(hostName);
+
+ hostCtxt.remove(hostName);
+ }
+ }
+ }
+
+ return serviceConfig;
+ }
+
+ public void resetData(){
+ serviceConfigurations =
+ new HashMap<String, Map<String, ServiceConfiguration>>();
+
+ serviceNameToServiceConfigurations =
+ new HashMap<String, List<ServiceConfiguration>>();
+
+ }
+
+
+ /**
+ * Duplications can only be seen, when you traverse down the configuration file.
+ *
+ */
+ public boolean isDuplicatedHost(String name, ServiceConfiguration serviceConfig) {
+
+ /**
+ * This will be populated with host names of all other services other than the
+ * service subjected to the test.
+ */
+ List<String> hostsOtherThanMine = new ArrayList<String>(hostNamesTracker.values().size());
+
+ for (Map.Entry<String, Set<String>> entry : hostNamesTracker.entrySet()) {
+ if (!entry.getKey().equals(name)) {
+ hostsOtherThanMine.addAll(entry.getValue());
+ }
+ }
+
+ for (String host : serviceConfig.getHosts()) {
+ if (!hostsOtherThanMine.isEmpty() && hostsOtherThanMine.contains(host)) {
+ return true;
+ }
+ }
+
+ addToHostNameTrackerMap(name, serviceConfig.getHosts());
+
+ return false;
+ }
+
+
+ public void addToHostNameTrackerMap(String name, List<String> hosts) {
+
+ Set<String> allHosts;
+
+ if (hostNamesTracker.containsKey(name)) {
+ allHosts = hostNamesTracker.get(name);
+ allHosts.addAll(hosts);
+ } else {
+ allHosts = new HashSet<String>(hosts);
+ }
+ hostNamesTracker.put(name, allHosts);
+ }
+
+ public void addToHostContextMap(String hostName, HostContext ctxt) {
+
+ if (hostName != null && ctxt != null) {
+ hostCtxt.put(hostName, ctxt);
+ }
+ }
+
+ /**
+ * Return a map of {@link HostContext}.
+ * @return
+ */
+ public Map<String, HostContext> getHostContextMap() {
+
+ List<Integer> tenantIds;
+ Map<String, String> URLSuffixes;
+
+ // FIXME if possible! I couldn't think of any other way to do this, at this moment.
+ // Note: some of these for-loops are pretty small, thus no considerable performance overhead.
+ // iterate through each service
+ for (Iterator<Set<String>> it = hostNamesTracker.values().iterator(); it.hasNext();) {
+
+ // iterate through host names of this service
+ for (String hostName : ((Set<String>) it.next())) {
+
+ // building HostContext
+ HostContext ctxt = new HostContext(hostName);
+
+ // iterate through domains of this host
+ for (Map.Entry<String, Map<String, ServiceConfiguration>> parentMap : serviceConfigurations.entrySet()) {
+
+ // iterate through sub domain of this domain
+ for (Map.Entry<String, ServiceConfiguration> childMap : parentMap.getValue()
+ .entrySet()) {
+ // iterate through hosts of this
+ for (String host : childMap.getValue().getHosts()) {
+ // if a matching Service configuration is found.
+ if (host.equals(hostName)) {
+
+ String tenantRange = childMap.getValue().getTenantRange();
+ String domain = parentMap.getKey();
+ String subDomain = childMap.getKey();
+
+ ctxt.addTenantDomainContexts(LoadBalancerConfigUtil.getTenantDomainContexts(tenantRange, domain, subDomain));
+
+ break;
+ }
+ }
+
+ //iterate through URL suffixes
+ for(Map.Entry<String, String> entry : childMap.getValue().getUrl_suffix().entrySet()) {
+ if(entry.getKey().equals(hostName)) {
+
+ ctxt.setUrlSuffix(entry.getValue());
+
+ break;
+ }
+
+ }
+ }
+ }
+
+ // add this hostCtxt
+ hostCtxt.put(hostName, ctxt);
+ }
+
+ }
+
+ return hostCtxt;
+
+ }
+
+ protected void createConfiguration(Configuration config, Node node) {
+
+ if (node == null) {
+ String msg = "The configuration element for " +
+ config.getClass().getName() + " is null.";
+ throw new RuntimeException(msg);
+ }
+
+ try {
+ // load properties
+ for (Map.Entry<String, String> entry : node.getProperties().entrySet()) {
+ String key = entry.getKey();
+ String value = entry.getValue();
+
+ PropertyHelper.setInstanceProperty(key, value, config);
+ }
+
+ } catch (Exception e) {
+ String msg = "Error setting values to " + config.getClass().getName();
+ log.error(msg, e);
+ throw new RuntimeException(msg, e);
+ }
+ }
+
+ public LBConfiguration getLoadBalancerConfig() {
+ return lbConfig;
+ }
+
+ public String[] getServiceDomains() {
+
+ Object[] objs = serviceConfigurations.keySet().toArray();
+
+ return Arrays.copyOf(objs, objs.length, String[].class);
+
+ }
+
+ public String[] getServiceSubDomains(String domain) {
+
+ if (serviceConfigurations.get(domain) != null) {
+ Object[] objs = serviceConfigurations.get(domain).keySet().toArray();
+ return Arrays.copyOf(objs, objs.length, String[].class);
+ }
+
+ return new String[0];
+ }
+
+ public ServiceConfiguration getServiceConfig(String domain, String subDomain) {
+ if (serviceConfigurations.get(domain) != null) {
+ return serviceConfigurations.get(domain).get(subDomain);
+ }
+ return null;
+ }
+
+
+ public List<ServiceConfiguration> getServiceConfigs(String serviceName) {
+ return serviceNameToServiceConfigurations.get(serviceName);
+ }
+
+ /**
+ * Convert given configuration file to a single String
+ *
+ * @param configFileName - file name to convert
+ * @return String with complete lb configuration
+ * @throws FileNotFoundException
+ */
+ public String createLBConfigString(String configFileName) throws FileNotFoundException {
+ StringBuilder lbConfigString = new StringBuilder("");
+
+ File configFile = new File(configFileName);
+ Scanner scanner;
+
+ scanner = new Scanner(configFile);
+
+ while (scanner.hasNextLine()) {
+ lbConfigString.append(scanner.nextLine().trim() + "\n");
+ }
+
+ return lbConfigString.toString().trim();
+ }
+
+ public String createLBConfigString(InputStream configFileName) throws IOException {
+
+ // read the stream with BufferedReader
+ BufferedReader br = new BufferedReader(new InputStreamReader(configFileName));
+
+ StringBuilder sb = new StringBuilder();
+
+ String line;
+ while ((line = br.readLine()) != null) {
+ sb.append(line.trim() + "\n");
+ }
+
+ return sb.toString().trim();
+ }
+
+ public abstract class Configuration implements Serializable {
+
+ private static final long serialVersionUID = -5433889427746551250L;
+ protected String imageId = System.getenv("ami_id");
+ protected String payload;
+ protected boolean payloadSet;
+
+ protected String availability_zone = "us-east-1c";
+ protected boolean availabilityZoneSet;
+
+ protected String[] security_groups = new String[]{"default"};
+ protected boolean securityGroupsSet;
+
+ protected String instance_type = "m1.large";
+ protected boolean instanceTypeSet;
+
+ protected String additional_info;
+
+ public String getImageId() {
+ return imageId;
+ }
+
+ public String getAdditionalInfo() {
+ return additional_info;
+ }
+
+ public String getAvailability_zone() {
+ if (this instanceof LBConfiguration) {
+ return availability_zone;
+ }
+ if (availabilityZoneSet) {
+ return availability_zone;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.availabilityZoneSet) {
+ return defaultServiceConfig.availability_zone;
+ }
+ return availability_zone;
+ }
+
+ public String[] getSecurityGroups() {
+ if (this instanceof LBConfiguration) {
+ return security_groups;
+ }
+ if (securityGroupsSet) {
+ return security_groups;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.securityGroupsSet) {
+ return defaultServiceConfig.security_groups;
+ }
+ return security_groups;
+ }
+
+ public String getInstanceType() {
+ if (this instanceof LBConfiguration) {
+ return instance_type;
+ }
+ if (instanceTypeSet) {
+ return instance_type;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.instanceTypeSet) {
+ return defaultServiceConfig.instance_type;
+ }
+ return instance_type;
+ }
+
+
+ public String getUserData() {
+ if (payload == null) {
+ payload = LoadBalancerConfigUtil.getUserData("resources/cluster_node.zip");
+ }
+ if (this instanceof LBConfiguration) {
+ return payload;
+ }
+ if (payloadSet) {
+ return payload;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.payloadSet) {
+ return defaultServiceConfig.payload;
+ }
+ return payload;
+ }
+
+ public void setPayload(String payload) {
+ this.payload = LoadBalancerConfigUtil.getUserData(LoadBalancerConfigUtil.replaceVariables(payload));
+ this.payloadSet = true;
+ }
+
+ public void setAvailability_zone(String availabilityZone) {
+ this.availability_zone = LoadBalancerConfigUtil.replaceVariables(availabilityZone);
+ this.availabilityZoneSet = true;
+ }
+
+ public void setSecurity_groups(String securityGroups) {
+ this.security_groups = LoadBalancerConfigUtil.replaceVariables(securityGroups).split(",");
+ this.securityGroupsSet = true;
+ }
+
+ public void setInstance_type(String instanceType) {
+ this.instance_type = LoadBalancerConfigUtil.replaceVariables(instanceType);
+ this.instanceTypeSet = true;
+ }
+
+ }
+
+ public class LBConfiguration extends Configuration implements Serializable {
+
+ private static final long serialVersionUID = 1357143883932816418L;
+ private String elasticIP;//= LoadBalancerConfigUtil.replaceVariables("${ELASTIC_IP}");
+ private int instances = 1;
+ private boolean isAutoscaleEnabled;
+ private int autoscalerTaskInterval = 30000;
+ private String autoscalerServiceEpr;
+ private int serverStartupDelay = 60000;
+ private int sizeOfCache = 0 ;
+ private boolean failOver;
+ private int sessionTimeOut = -1;
+ private String groupManagementAgentClass;
+ private String autoscalerTaskClass;
+ private String mbServerUrl;
+ private boolean useEmbeddedAutoscaler = true;
+ private String algorithm = "org.apache.synapse.endpoints.algorithms.RoundRobin";
+
+ public String getElasticIP() {
+ return elasticIP;
+ }
+
+ public int getInstances() {
+ return instances;
+ }
+
+ public boolean isAutoscaleEnabled() {
+ return isAutoscaleEnabled;
+ }
+
+ public boolean useEmbeddedAutoscaler() {
+ return useEmbeddedAutoscaler;
+ }
+
+ public boolean getFailOver() {
+ return failOver;
+ }
+
+ public String getAutoscalerServiceEpr() {
+ return autoscalerServiceEpr;
+ }
+
+ public int getAutoscalerTaskInterval() {
+ return autoscalerTaskInterval;
+ }
+
+ public int getServerStartupDelay() {
+ return serverStartupDelay;
+ }
+
+ public int getSessionTimeOut() {
+ return sessionTimeOut;
+ }
+
+ public void setElasticIP(String elasticIP) {
+ this.elasticIP = LoadBalancerConfigUtil.replaceVariables(elasticIP);
+ }
+
+ public void setInstances(int instances) {
+ this.instances = instances;
+ }
+
+ public void setEnable_autoscaler(String isEnabled) {
+ this.isAutoscaleEnabled = Boolean.parseBoolean(isEnabled);
+ }
+
+ public void setUse_embedded_autoscaler(String use) {
+ this.useEmbeddedAutoscaler = Boolean.parseBoolean(use);
+ }
+
+ public void setFail_over(String isEnabled) {
+ this.failOver = Boolean.parseBoolean(isEnabled);
+ }
+
+ public void setAutoscaler_service_epr(String epr) {
+ this.autoscalerServiceEpr = epr;
+ }
+
+ public void setMb_server_url(String url) {
+ this.mbServerUrl = url;
+ }
+
+ public String getMbServerUrl() {
+ return mbServerUrl;
+ }
+
+ public void setAutoscaler_task_interval(String interval) {
+ this.autoscalerTaskInterval = Integer.parseInt(interval);
+ }
+
+ public void setServer_startup_delay(String delay) {
+ this.serverStartupDelay = Integer.parseInt(delay);
+ }
+
+ public void setSession_timeout(String timeout) {
+ this.sessionTimeOut = Integer.parseInt(timeout);
+ }
+
+ public String getAlgorithm() {
+ return algorithm;
+ }
+
+ public void setAlgorithm(String algorithm) {
+ if (algorithm != null) {
+ this.algorithm = algorithm;
+ }
+ }
+
+ public int getSizeOfCache() {
+ return sizeOfCache;
+ }
+
+ public void setSize_of_cache(int sizeOfCache) {
+ this.sizeOfCache = sizeOfCache;
+ }
+
+ public String getGroupManagementAgentClass() {
+ return groupManagementAgentClass;
+ }
+
+ public String getAutoscalerTaskClass() {
+ return autoscalerTaskClass;
+ }
+
+ public void setGroup_mgt_agent(String groupManagementAgentClass){
+ this.groupManagementAgentClass = groupManagementAgentClass;
+ }
+
+ public void setAutoscaler_task(String autoscalerTaskClass){
+ this.autoscalerTaskClass = autoscalerTaskClass;
+ }
+ }
+
+ public class ServiceConfiguration extends Configuration implements Serializable {
+
+ private String serviceName;
+
+ public String getServiceName() {
+ return serviceName;
+ }
+
+ public void setServiceName(String name) {
+ this.serviceName = name;
+ }
+
+ public String getPublicIp() {
+ return publicIp;
+ }
+
+ public void setPublic_ip(String publicIp) {
+ this.publicIp = publicIp;
+ }
+
+ private String publicIp;
+
+ private static final long serialVersionUID = 8707314702788040116L;
+ private int minAppInstances = 1;
+ private boolean minAppInstancesSet;
+
+ private int maxAppInstances = 3;
+ private boolean maxAppInstancesSet;
+
+ private int maxRequestsPerSecond = 100;
+ private boolean maxRequestsPerSecondSet;
+
+ private double alarmingUpperRate = 0.7;
+ private boolean alarmingUpperRateSet;
+
+ private double alarmingLowerRate = 0.2;
+ private boolean alarmingLowerRateSet;
+
+ private double scaleDownFactor = 0.25;
+ private boolean scaleDownFactorSet;
+
+ private int roundsToAverage = 10;
+ private boolean roundsToAverageSet;
+
+ private int instancesPerScaleUp = 1;
+ private boolean instancesPerScaleUpSet;
+
+ private int messageExpiryTime = 60000; // milliseconds
+ private boolean messageExpiryTimeSet;
+
+ private List<String> hosts = new ArrayList<String>();
+ private Map<String, String> urlSuffixes = new HashMap<String, String>();
+ private boolean hostsSet;
+
+ private String domain;
+
+ private String tenantRange;
+ private boolean tenantRangeSet;
+
+ private String subDomain = Constants.DEFAULT_SUB_DOMAIN;
+ private boolean subDomainSet;
+
+ public String getTenantRange() {
+ if (tenantRangeSet) {
+ return tenantRange;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.tenantRangeSet) {
+ return defaultServiceConfig.tenantRange;
+ }
+ return tenantRange;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public List<String> getHosts() {
+ if (hostsSet) {
+ return hosts;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.hostsSet) {
+ return defaultServiceConfig.hosts;
+ }
+ return hosts;
+ }
+
+ public int getMinAppInstances() {
+ if (minAppInstancesSet) {
+ return minAppInstances;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.minAppInstancesSet) {
+ return defaultServiceConfig.minAppInstances;
+ }
+ return minAppInstances;
+ }
+
+ public int getMaxAppInstances() {
+ if (maxAppInstancesSet) {
+ return maxAppInstances;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.maxAppInstancesSet) {
+ return defaultServiceConfig.maxAppInstances;
+ }
+ return maxAppInstances;
+ }
+
+ public int getMaxRequestsPerSecond() {
+ if (maxRequestsPerSecondSet) {
+ return maxRequestsPerSecond;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.maxRequestsPerSecondSet) {
+ return defaultServiceConfig.maxRequestsPerSecond;
+ }
+ return maxRequestsPerSecond;
+ }
+
+ public int getRoundsToAverage() {
+ if (roundsToAverageSet) {
+ return roundsToAverage;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.roundsToAverageSet) {
+ return defaultServiceConfig.roundsToAverage;
+ }
+ return roundsToAverage;
+ }
+
+ public int getInstancesPerScaleUp() {
+ if (instancesPerScaleUpSet) {
+ return instancesPerScaleUp;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.instancesPerScaleUpSet) {
+ return defaultServiceConfig.instancesPerScaleUp;
+ }
+ return instancesPerScaleUp;
+ }
+
+ public int getMessageExpiryTime() {
+ if (messageExpiryTimeSet) {
+ return messageExpiryTime;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.messageExpiryTimeSet) {
+ return defaultServiceConfig.messageExpiryTime;
+ }
+ return messageExpiryTime;
+ }
+
+ public String getSubDomain() {
+ if (subDomainSet) {
+ return subDomain;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.subDomainSet) {
+ return defaultServiceConfig.subDomain;
+ }
+ return subDomain;
+ }
+
+ public void setMin_app_instances(int minAppInstances) {
+// if (minAppInstances < 1) {
+// LoadBalancerConfigUtil.handleException("minAppInstances in the autoscaler task configuration " +
+// "should be at least 1");
+// }
+ this.minAppInstances = minAppInstances;
+ this.minAppInstancesSet = true;
+ }
+
+ public void setMax_app_instances(int maxAppInstances) {
+ if (maxAppInstances < 1) {
+ LoadBalancerConfigUtil.handleException("maxAppInstances in the autoscaler task configuration " +
+ "should be at least 1");
+ }
+ this.maxAppInstances = maxAppInstances;
+ this.maxAppInstancesSet = true;
+ }
+
+ public void setAlarming_upper_rate(double rate) {
+ if (rate > 0 && rate <= 1) {
+ this.alarmingUpperRate = rate;
+ this.alarmingUpperRateSet = true;
+ }
+ }
+
+ public void setAlarming_lower_rate(double rate) {
+ if (rate > 0 && rate <= 1) {
+ this.alarmingLowerRate = rate;
+ this.alarmingLowerRateSet = true;
+ }
+ }
+
+ public void setScale_down_factor(double factor) {
+ if (factor > 0 && factor <= 1) {
+ this.scaleDownFactor = factor;
+ this.scaleDownFactorSet = true;
+ }
+ }
+
+ public void setMax_requests_per_second(int rps) {
+ this.maxRequestsPerSecond = rps;
+ this.maxRequestsPerSecondSet = true;
+ }
+
+ public void setRounds_to_average(int roundsToAverage) {
+ this.roundsToAverage = roundsToAverage;
+ this.roundsToAverageSet = true;
+ }
+
+ public void setInstances_per_scale_up(int instancesPerScaleUp) {
+ if (instancesPerScaleUp < 1) {
+ LoadBalancerConfigUtil.handleException("instancesPerScaleUp in the autoscaler task configuration " +
+ "should be at least 1");
+ }
+ this.instancesPerScaleUp = instancesPerScaleUp;
+ this.instancesPerScaleUpSet = true;
+ }
+
+ public void setMessage_expiry_time(int messageExpiryTime) {
+ if (messageExpiryTime < 1) {
+ LoadBalancerConfigUtil.handleException("messageExpiryTime in the autoscaler task configuration " +
+ "should be at least 1");
+ }
+ this.messageExpiryTime = messageExpiryTime;
+ this.messageExpiryTimeSet = true;
+ }
+
+ public void setHosts(String hostsStr) {
+ // clear all unnecessary values --> property will get overwritten
+ hosts = new ArrayList<String>();
+ // there can be multiple hosts, let's find out.
+ String[] host = hostsStr.split(Constants.HOSTS_DELIMITER);
+
+ for (String string : host) {
+ if (!string.isEmpty()) {
+ this.hosts.add(string);
+ }
+ }
+
+ }
+
+ public void setUrl_suffix(String suffix) {
+ // clear all unnecessary values --> property will get overwritten
+ //hosts = new ArrayList<String>();
+ // there can be multiple hosts, let's find out.
+ String[] suffixes = suffix.split(Constants.HOSTS_DELIMITER);
+ int count = 0;
+ if(suffixes.length == this.hosts.size()) {
+ for (String string : suffixes) {
+ if (!string.isEmpty()) {
+ this.urlSuffixes.put(this.hosts.get(count), string);
+ count++;
+ }
+ }
+
+ } else {
+ //Error
+ }
+ }
+
+ public Map<String, String> getUrl_suffix() {
+ return this.urlSuffixes;
+ }
+
+ public void setTenant_range(String range) {
+ this.tenantRange = range;
+ }
+
+ public void setSub_domain(String subDomain) {
+ this.subDomain = subDomain;
+ this.subDomainSet = true;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ public boolean equals(ServiceConfiguration config) {
+ return this.domain.equals(config.getDomain()) &&
+ this.subDomain.equals(config.getSubDomain());
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+ append(domain).
+ append(subDomain).
+ toHashCode();
+ }
+
+ public double getAlarmingUpperRate() {
+ if (alarmingUpperRateSet) {
+ return alarmingUpperRate;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.alarmingUpperRateSet) {
+ return defaultServiceConfig.alarmingUpperRate;
+ }
+ return alarmingUpperRate;
+ }
+
+ public double getAlarmingLowerRate() {
+ if (alarmingLowerRateSet) {
+ return alarmingLowerRate;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.alarmingLowerRateSet) {
+ return defaultServiceConfig.alarmingLowerRate;
+ }
+ return alarmingLowerRate;
+ }
+
+ public double getScaleDownFactor() {
+ if (scaleDownFactorSet) {
+ return scaleDownFactor;
+ } else if (defaultServiceConfig != null && defaultServiceConfig.scaleDownFactorSet) {
+ return defaultServiceConfig.scaleDownFactor;
+ }
+ return scaleDownFactor;
+ }
+ }
+
+ public Map<String, Set<String>> getHostNamesTracker() {
+ return hostNamesTracker;
+ }
+
+
+ public Map<String, Map<String, ServiceConfiguration>> getServiceConfigurations() {
+ return serviceConfigurations;
+ }
+
+
+ public Node getRootNode() {
+ return rootNode;
+ }
+
+
+ public void setRootNode(Node rootNode) {
+ this.rootNode = rootNode;
+ }
+
+ public static void setInstance(LoadBalancerConfiguration instance) {
+ LoadBalancerConfiguration.instance = instance;
+ }
+
+ public Map<String, List<ServiceConfiguration>> getServiceNameToServiceConfigurations() {
+ return serviceNameToServiceConfigurations;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/internal/LoadBalancerConfigurationDSComponent.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/internal/LoadBalancerConfigurationDSComponent.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/internal/LoadBalancerConfigurationDSComponent.java
new file mode 100644
index 0000000..b488bf3
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/internal/LoadBalancerConfigurationDSComponent.java
@@ -0,0 +1,46 @@
+/*
+* Copyright (c) 2005-2011, 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.lb.common.conf.internal;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+import org.wso2.carbon.lb.common.service.LoadBalancerConfigurationService;
+import org.wso2.carbon.lb.common.service.impl.LoadBalancerConfigurationServiceImpl;
+
+/**
+ * Registering {@link LoadBalancerConfigurationService} .
+ * @scr.component name="org.wso2.carbon.lb.common" immediate="true"
+ */
+public class LoadBalancerConfigurationDSComponent {
+
+ private static final Log log = LogFactory.getLog(LoadBalancerConfigurationDSComponent.class);
+
+ protected void activate(ComponentContext context) {
+ try {
+ BundleContext bundleContext = context.getBundleContext();
+ bundleContext.registerService(LoadBalancerConfigurationService.class.getName(),
+ new LoadBalancerConfigurationServiceImpl(), null);
+
+ log.debug("******* Load Balancer Configuration Service bundle is activated ******* ");
+ } catch (Exception e) {
+ log.error("******* Load Balancer Configuration Service bundle is failed to activate ****", e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/Node.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/Node.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/Node.java
new file mode 100644
index 0000000..a1ccc60
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/Node.java
@@ -0,0 +1,355 @@
+/*
+ * Copyright (c) 2005-2011, 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.lb.common.conf.structure;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * This is the basic data structure which holds a <i>Nginx</i> formatted configuration file.
+ *
+ */
+public class Node implements Serializable{
+
+ private static final long serialVersionUID = 4071569903421115370L;
+
+ /**
+ * Name of this Node element
+ */
+ private String name;
+
+ /**
+ * Every node can have 0..n child nodes.
+ * They are kept in a List.
+ */
+ private List<Node> childNodes = new ArrayList<Node>();
+
+ /**
+ * Every node can have 0..n properties.
+ * They are kept in a Map, in the order they appear.
+ * Key: property name
+ * Value: property value
+ */
+ private Map<String, String> properties = new LinkedHashMap<String, String>();
+
+ public void setChildNodes(List<Node> childNodes) {
+ this.childNodes = childNodes;
+ }
+
+ public void setProperties(Map<String, String> properties) {
+ this.properties = properties;
+ }
+
+ /**
+ * This will convert each child Node of this Node to a String.
+ * @return a string which represents child nodes of this node.
+ */
+ public String childNodesToString(int indentation) {
+ StringBuilder childNodesString = new StringBuilder();
+ indentation++;
+
+ for (Node node : childNodes) {
+ childNodesString.append(node.toString(indentation)+"\n");
+ }
+
+ return childNodesString.toString();
+ }
+
+ /**
+ * This will try to find a child Node of this Node, which has the given name.
+ * @param name name of the child node to find.
+ * @return child Node object if found or else <code>null</code>.
+ */
+ public Node findChildNodeByName(String name) {
+ for (Node aNode : childNodes) {
+ if (aNode.getName().equals(name)) {
+ return aNode;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the name of this Node.
+ * @return name of the node.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Returns child nodes List of this Node.
+ * @return List of Node
+ */
+ public List<Node> getChildNodes() {
+ return childNodes;
+ }
+
+ /**
+ * Returns properties Map of this Node.
+ * @return Map whose keys and values are String.
+ */
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ /**
+ * Returns the value of a given property.
+ * @param key name of a property.
+ * @return trimmed value if the property is found in this Node, or else <code>null</code>.
+ */
+ public String getProperty(String key) {
+ if (properties.get(key) == null) {
+ return null;
+ }
+ return properties.get(key).trim();
+ }
+
+ /**
+ * Returns all the properties of this Node as a String.
+ * Key and value of the property is separated by a tab (\t) character and
+ * each property is separated by a new line character.
+ * @param indentation relative number of tabs
+ * @return properties of this node as a String.
+ */
+ public String propertiesToString(int indentation) {
+
+ String indent = getIndentation(indentation);
+
+ StringBuilder sb = new StringBuilder();
+ for (Map.Entry<String, String> entry : properties.entrySet()) {
+ // hack to get a quick fix in.
+ if (!"tenant_id".equals(entry.getKey()) && !"alias".equals(entry.getKey())) {
+ sb.append(indent + entry.getKey() + "\t" + entry.getValue() + ";\n");
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * Removes the first occurrence of a node having the given name
+ * and returns the removed {@link Node}.
+ * @param name name of the child node to be removed.
+ * @return removed {@link Node} or else <code>null</code>.
+ */
+ public Node removeChildNode(String name) {
+ Node aNode = findChildNodeByName(name);
+
+ if(aNode != null){
+ if(childNodes.remove(aNode)){
+ return aNode;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Removes the first occurrence of a node equals to the given node.
+ * @param node {@link Node} to be removed.
+ * @return whether the removal is successful or not.
+ */
+ public boolean removeChildNode(Node node){
+
+ return childNodes.remove(node);
+ }
+
+ /**
+ * Sets the name of this Node.
+ * @param name String to be set as the name.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * Appends a child node at the end of the List of child nodes of this Node, if
+ * a similar node is not already present as a child node.
+ * @param aNode child Node to be appended.
+ */
+ public void appendChild(Node aNode) {
+ if (aNode != null && !nodeAlreadyPresent(aNode)) {
+ childNodes.add(aNode);
+ }
+ }
+
+ /**
+ * Adds a new property to properties Map of this Node if and only if
+ * key is not <code>null</code>.
+ * @param key name of the property to be added.
+ * @param value value of the property to be added.
+ */
+ public void addProperty(String key, String value) {
+ if (key != null) {
+ properties.put(key, value);
+ }
+ }
+
+ /**
+ * Convert this Node to a String which is in <i>Nginx</i> format.
+ * <br/>
+ * Sample:
+ * <br></br>
+ * <code>
+ * ij {
+ * <br/>
+ * klm n;
+ * <br/>
+ * pq {
+ * <br/>
+ * rst u;
+ * <br/>
+ * }
+ * <br/>
+ * }
+ * <br/>
+ * </code>
+ */
+ public String toString() {
+
+ String nodeString =
+ getName()+" {\n" +
+ (propertiesToString(1)) +
+ (childNodesToString(1)) +
+ "}";
+
+ return nodeString;
+ }
+
+ public boolean equals(Object node) {
+
+ if(node instanceof Node){
+ return this.getName().equals(((Node) node).getName()) &&
+ isIdenticalProperties(this.getProperties(), ((Node) node).getProperties()) &&
+ isIdenticalChildren(this.getChildNodes(), ((Node) node).getChildNodes());
+ }
+
+ return false;
+
+ }
+
+ public int hashCode() {
+ return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers
+ append(name).
+ append(properties).
+ append(childNodes).
+ toHashCode();
+ }
+
+ private boolean isIdenticalChildren(List<Node> childNodes1, List<Node> childNodes2) {
+
+ if(childNodes1.size() != childNodes2.size()){
+ return false;
+ }
+
+ for (Node node1 : childNodes1) {
+ int i=0;
+ for (Node node2 : childNodes2) {
+
+ i++;
+ if(node1.equals(node2)){
+ break;
+ }
+
+ if(i == childNodes1.size()){
+ return false;
+ }
+
+ }
+ }
+
+ return true;
+ }
+
+ private boolean nodeAlreadyPresent(Node aNode){
+
+ for(Node node : this.childNodes){
+ if(node.equals(aNode)){
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private boolean isIdenticalProperties(Map<String, String> map1,
+ Map<String, String> map2) {
+
+ if(map1.size() != map2.size()){
+ return false;
+ }
+
+ for (Iterator<Entry<String, String>> iterator1 = map1.entrySet().iterator(); iterator1.hasNext();) {
+ Map.Entry<String, String> entry1 = (Map.Entry<String, String>) iterator1.next();
+
+ int i=0;
+
+ for(Iterator<Entry<String, String>> iterator2 = map2.entrySet().iterator(); iterator2.hasNext();) {
+ Map.Entry<String, String> entry2 = (Map.Entry<String, String>) iterator2.next();
+
+ i++;
+
+ if((entry1.getKey().equals(entry2.getKey()) &&
+ entry1.getValue().equals(entry2.getValue()))){
+
+ break;
+ }
+
+ if(i == map1.size()){
+ return false;
+ }
+
+ }
+ }
+
+ return true;
+ }
+
+ private String toString(int indentation){
+
+ String indent = getIndentation(indentation-1);
+
+ String nodeString =
+ indent + getName()+" {\n" +
+ (propertiesToString(indentation)) +
+ (childNodesToString(indentation)) +
+ indent + "}";
+
+ return nodeString;
+ }
+
+ private String getIndentation(int tabs){
+
+ StringBuilder indent = new StringBuilder("");
+
+ for (int i = 0; i < tabs; i++) {
+ indent.append("\t");
+ }
+
+ return indent.toString();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/NodeBuilder.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/NodeBuilder.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/NodeBuilder.java
new file mode 100644
index 0000000..f7bfe2f
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/structure/NodeBuilder.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 2005-2011, 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.lb.common.conf.structure;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.lb.common.conf.util.Constants;
+
+/**
+ * This responsible for build up a Node object from a given content.
+ * Every closing brace should be in a new line.
+ */
+public class NodeBuilder {
+
+ private static final Log log = LogFactory.getLog(NodeBuilder.class);
+
+ /**
+ * This method is useful when you do not have a root node in your content.
+ * @param aNode
+ * Node object whose name set.
+ * @param content
+ * should be something similar to following.
+ *
+ * abc d;
+ * efg h;
+ * # comment
+ * ij { # comment
+ * klm n;
+ *
+ * pq {
+ * rst u;
+ * }
+ * }
+ *
+ * @return fully constructed Node
+ */
+ public static Node buildNode(Node aNode, String content) {
+
+ if(content == null || content.isEmpty()){
+ return aNode;
+ }
+
+ String[] lines = content.split("\n");
+
+ for (int i = 0; i < lines.length; i++) {
+ String line = lines[i].trim();
+
+ // avoid line comments
+ if (!line.startsWith(Constants.NGINX_COMMENT)) {
+
+ // skip comments in-line
+ if(line.contains(Constants.NGINX_COMMENT)){
+ line = line.substring(0, line.indexOf(Constants.NGINX_COMMENT));
+ }
+
+ // another node is detected and it is not a variable starting from $
+ if (line.contains(Constants.NGINX_NODE_START_BRACE) &&
+ !line.contains(Constants.NGINX_VARIABLE)) {
+
+ try {
+ Node childNode = new Node();
+ childNode.setName(line.substring(0, line.indexOf(Constants.NGINX_NODE_START_BRACE)).trim());
+
+ StringBuilder sb = new StringBuilder();
+
+ int matchingBraceTracker = 1;
+
+ while (!line.contains(Constants.NGINX_NODE_END_BRACE) || matchingBraceTracker != 0) {
+ i++;
+ if (i == lines.length) {
+ break;
+ }
+ line = lines[i];
+ if (line.contains(Constants.NGINX_NODE_START_BRACE)) {
+ matchingBraceTracker++;
+ }
+ if (line.contains(Constants.NGINX_NODE_END_BRACE)) {
+ matchingBraceTracker--;
+ }
+ sb.append(line + "\n");
+ }
+
+ childNode = buildNode(childNode, sb.toString());
+ if (aNode == null) {
+ aNode = childNode;
+ } else {
+ aNode.appendChild(childNode);
+ }
+
+ } catch (Exception e) {
+ String msg = "Malformatted element is defined in the configuration file. [" +
+ i + "] \n";
+ log.error(msg , e);
+ throw new RuntimeException(msg + line, e);
+ }
+
+ }
+ // this is a property
+ else {
+ if (!line.isEmpty() && !Constants.NGINX_NODE_END_BRACE.equals(line)) {
+ String[] prop = line.split(Constants.NGINX_SPACE_REGEX);
+ String value = line.substring(prop[0].length(), line.indexOf(Constants.NGINX_LINE_DELIMITER)).trim();
+ try {
+ aNode.addProperty(prop[0], value);
+ } catch (Exception e) {
+ String msg = "Malformatted property is defined in the configuration file. [" +
+ i + "] \n";
+ log.error(msg, e);
+ throw new RuntimeException(msg + line, e);
+ }
+ }
+ }
+
+ }
+ }
+
+ return aNode;
+
+ }
+
+ public static Node buildNode(String content) {
+ return buildNode(null, content);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/Constants.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/Constants.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/Constants.java
new file mode 100644
index 0000000..bc83ca9
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/Constants.java
@@ -0,0 +1,49 @@
+/*
+* Copyright (c) 2005-2011, 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.lb.common.conf.util;
+
+/**
+ * This keeps the element names used in loadbalancer.conf file
+ */
+public class Constants {
+
+ public static final String LOAD_BALANCER_ELEMENT = "loadbalancer";
+ public static final String SERVICES_ELEMENT = "services";
+ public static final String DEFAULTS_ELEMENT = "defaults";
+ public static final String HOSTS_ELEMENT = "hosts";
+ public static final String HOSTS_DELIMITER = ",";
+ public static final String DOMAIN_ELEMENT = "domains";
+ public static final String TENANT_RANGE_ELEMENT = "tenant_range";
+ public static final String SUB_DOMAIN_ELEMENT = "sub_domain";
+ public static final String TENANT_RANGE_DELIMITER = "-";
+ public static final String UNLIMITED_TENANT_RANGE = "*";
+ public static final String AUTOSCALER_ENABLE_ELEMENT = "enable_autoscaler";
+ public static final String SUB_DOMAIN_DELIMITER = "#";
+ public static final String DEFAULT_SUB_DOMAIN = "__$default";
+
+ /* Nginx format related constants */
+
+ public static final String NGINX_COMMENT = "#";
+ public static final String NGINX_NODE_START_BRACE = "{";
+ public static final String NGINX_NODE_END_BRACE = "}";
+ public static final String NGINX_VARIABLE = "${";
+ public static final String NGINX_LINE_DELIMITER = ";";
+ public static final String NGINX_SPACE_REGEX = "[\\s]+";
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/HostContext.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/HostContext.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/HostContext.java
new file mode 100644
index 0000000..1845017
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/HostContext.java
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2005-2011, 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.lb.common.conf.util;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.synapse.endpoints.algorithms.AlgorithmContext;
+import org.apache.synapse.endpoints.algorithms.LoadbalanceAlgorithm;
+
+/**
+ * For each unique host name defined in loadbalancer configuration, we'll generate
+ * this object.
+ */
+public class HostContext {
+
+ /**
+ * A unique identifier to identify this {@link #HostContext()}
+ */
+ private String hostName;
+
+ /**
+ * Key - tenant id
+ * Value - <code>TenantDomainContext</code> of the corresponding tenant
+ */
+ private Map<Integer, TenantDomainContext> tenantIdToTenantDomainContextMap = new HashMap<Integer, TenantDomainContext>();
+
+ /**
+ * AlgorithmContext of this host
+ */
+ private AlgorithmContext algorithmContext;
+
+ /**
+ * Load balance algorithm of this host
+ */
+ private LoadbalanceAlgorithm algorithm;
+
+ private String urlSuffix;
+
+ public HostContext(String hostName) {
+ this.hostName = hostName;
+ }
+
+ public void addTenantDomainContexts(List<TenantDomainContext> ctxts) {
+
+ for (TenantDomainContext tenantDomainContext : ctxts) {
+ tenantIdToTenantDomainContextMap.put(tenantDomainContext.getTenantId(), tenantDomainContext);
+ }
+ }
+
+ @Deprecated
+ public void addTenantDomainContext(TenantDomainContext ctxt) {
+ tenantIdToTenantDomainContextMap.put(ctxt.getTenantId(), ctxt);
+ }
+
+ public TenantDomainContext getTenantDomainContext(int tenantId) {
+ return tenantIdToTenantDomainContextMap.get(tenantId);
+ }
+
+ /**
+ * Returns all the {@link TenantDomainContext} entries.
+ */
+ public Collection<TenantDomainContext> getTenantDomainContexts() {
+ return tenantIdToTenantDomainContextMap.values();
+ }
+
+ /**
+ * Given a tenant id, this will return its domain.
+ * @param tenantId
+ * @return domain if this tenant has a dedicated one, it will be returned.
+ * If not, and there's a default (*) domain, it will be returned.
+ * If neither of the above is defined, null will be returned.
+ */
+ public String getDomainFromTenantId(int tenantId) {
+ if (tenantIdToTenantDomainContextMap.get(tenantId) == null) {
+ // if there's no specific domain for this tenant, we will redirect it to the default
+ // cluster
+
+ if(tenantIdToTenantDomainContextMap.get(0) == null){
+ return null;
+ }
+
+ return tenantIdToTenantDomainContextMap.get(0).getDomain();
+ }
+
+ return tenantIdToTenantDomainContextMap.get(tenantId).getDomain();
+ }
+
+ /**
+ * Given a tenant id, this will return its sub domain.
+ * @param tenantId
+ * @return sub_domain if this tenant has a dedicated one, it will be returned.
+ * If not, and there's a default (*) sub domain, it will be returned.
+ * If neither of the above is defined, null will be returned.
+ */
+ public String getSubDomainFromTenantId(int tenantId) {
+ if (tenantIdToTenantDomainContextMap.get(tenantId) == null) {
+ // if there's no specific domain for this tenant, we will redirect it to the default
+ // cluster
+
+ if(tenantIdToTenantDomainContextMap.get(0) == null){
+ return null;
+ }
+
+ return tenantIdToTenantDomainContextMap.get(0).getSubDomain();
+ }
+
+ return tenantIdToTenantDomainContextMap.get(tenantId).getSubDomain();
+ }
+
+ public String getHostName() {
+ return hostName;
+ }
+
+ public LoadbalanceAlgorithm getAlgorithm() {
+ return algorithm;
+ }
+
+ public AlgorithmContext getAlgorithmContext() {
+ return algorithmContext;
+ }
+
+ public void setAlgorithmContext(AlgorithmContext algorithmContext) {
+ this.algorithmContext = algorithmContext;
+ }
+
+ public void setAlgorithm(LoadbalanceAlgorithm algorithm) {
+ this.algorithm = algorithm;
+ }
+
+ public Map<Integer, TenantDomainContext> getTenantIdToTenantDomainContextMap() {
+ return tenantIdToTenantDomainContextMap;
+ }
+
+ public void setUrlSuffix(String suffix) {
+ this.urlSuffix = suffix;
+ }
+
+ public String getUrlSuffix() {
+ return this.urlSuffix;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/LoadBalancerConfigUtil.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/LoadBalancerConfigUtil.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/LoadBalancerConfigUtil.java
new file mode 100644
index 0000000..404849b
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/LoadBalancerConfigUtil.java
@@ -0,0 +1,288 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * 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.wso2.carbon.lb.common.conf.util;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.SynapseException;
+import sun.misc.BASE64Encoder;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Utility methods for Autoscale mediator
+ */
+public final class LoadBalancerConfigUtil {
+
+ private static final Log log = LogFactory.getLog(LoadBalancerConfigUtil.class);
+
+ private LoadBalancerConfigUtil() {
+ }
+
+ /**
+ * handles the exception
+ *
+ * @param msg
+ * exception message
+ */
+ public static void handleException(String msg) {
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ /**
+ * handles the exception
+ *
+ * @param msg
+ * exception message
+ * @param e
+ * exception
+ */
+ public static void handleException(String msg, Exception e) {
+ log.error(msg, e);
+ throw new SynapseException(msg, e);
+ }
+
+ /**
+ * Replaces the variables
+ *
+ * @param text
+ * input string
+ * @return output String
+ */
+ public static String replaceVariables(String text) {
+ int indexOfStartingChars;
+ int indexOfClosingBrace;
+
+ // The following condition deals with properties.
+ // Properties are specified as ${system.property},
+ // and are assumed to be System properties
+ if ((indexOfStartingChars = text.indexOf("${")) != -1 &&
+ (indexOfClosingBrace = text.indexOf("}")) != -1) { // Is a property used?
+ String var = text.substring(indexOfStartingChars + 2, indexOfClosingBrace);
+
+ String propValue = System.getProperty(var);
+ if (propValue == null) {
+ propValue = System.getenv(var);
+ }
+ if (propValue != null) {
+ text =
+ text.substring(0, indexOfStartingChars) + propValue +
+ text.substring(indexOfClosingBrace + 1);
+ }
+ }
+ return text;
+ }
+
+ public static String getUserData(String payloadFileName) {
+ String userData = null;
+ try {
+ File file = new File(payloadFileName);
+ if (!file.exists()) {
+ handleException("Payload file " + payloadFileName + " does not exist");
+ }
+ if (!file.canRead()) {
+ handleException("Payload file " + payloadFileName + " does cannot be read");
+ }
+ byte[] bytes = LoadBalancerConfigUtil.getBytesFromFile(file);
+ if (bytes != null) {
+ BASE64Encoder encoder = new BASE64Encoder();
+ userData = encoder.encode(bytes);
+ }
+ } catch (Exception e) {
+ LoadBalancerConfigUtil.handleException("Cannot read data from payload file " +
+ payloadFileName, e);
+
+ }
+ return userData;
+ }
+
+ /**
+ * Returns the contents of the file in a byte array
+ *
+ * @param file
+ * - Input File
+ * @return Bytes from the file
+ * @throws java.io.IOException
+ * , if retrieving the file contents failed.
+ */
+ public static byte[] getBytesFromFile(File file) throws IOException {
+ if (!file.exists()) {
+ log.error("Payload file " + file.getAbsolutePath() + " does not exist");
+ return null;
+ }
+ InputStream is = new FileInputStream(file);
+ byte[] bytes;
+
+ try {
+ // Get the size of the file
+ long length = file.length();
+
+ // You cannot create an array using a long type.
+ // It needs to be an int type.
+ // Before converting to an int type, check
+ // to ensure that file is not larger than Integer.MAX_VALUE.
+ if (length > Integer.MAX_VALUE) {
+ if (log.isDebugEnabled()) {
+ log.debug("File is too large");
+ }
+ }
+
+ // Create the byte array to hold the data
+ bytes = new byte[(int) length];
+
+ // Read in the bytes
+ int offset = 0;
+ int numRead;
+ while (offset < bytes.length &&
+ (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
+ offset += numRead;
+ }
+
+ // Ensure all the bytes have been read in
+ if (offset < bytes.length) {
+ throw new IOException("Could not completely read file " + file.getName());
+ }
+ } finally {
+ // Close the input stream and return bytes
+ is.close();
+ }
+
+ return bytes;
+ }
+
+ /**
+ * @deprecated
+ * Extract the domain part given a string which is in
+ * <sub_domain>#<domain> format.
+ * @param str
+ * in <sub_domain>#<domain> format.
+ * @return the domain part. If # is not present this will return the trimmed
+ * input string.
+ */
+ public static String getDomain(String str) {
+ str = str.trim();
+ if (!str.contains(Constants.SUB_DOMAIN_DELIMITER)) {
+ return str;
+ }
+ return str.substring(str.indexOf(Constants.SUB_DOMAIN_DELIMITER) + 1);
+ }
+
+ /**
+ * @deprecated
+ * Extract the sub_domain part given a string which is in
+ * <sub_domain>#<domain> format.
+ * @param str
+ * in <sub_domain>#<domain> format.
+ * @return the sub_domain part. If # is not present this will return <code>null</code>.
+ */
+ public static String getSubDomain(String str) {
+ str = str.trim();
+ if (!str.contains(Constants.SUB_DOMAIN_DELIMITER)) {
+ return null;
+ }
+ return str.substring(0, str.indexOf(Constants.SUB_DOMAIN_DELIMITER));
+ }
+
+ // public static EC2InstanceManager createEC2InstanceManager(String accessKey,
+ // String secretKey,
+ // String instanceMgtEPR) {
+ // AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
+ // AmazonEC2Client ec2Client = new AmazonEC2Client(awsCredentials);
+ // ec2Client.setEndpoint(instanceMgtEPR);
+ // return new EC2InstanceManager(ec2Client);
+ // }
+
+ public static List<TenantDomainContext> getTenantDomainContexts(String tenantRange, String domain, String subDomain) {
+
+ List<TenantDomainContext> ctxts = new ArrayList<TenantDomainContext>();
+ List<Integer> tenantIds = getTenantIds(tenantRange);
+
+ // iterate through all tenant ids under this host
+ for (Integer tId : tenantIds) {
+
+ // create a new TenantDomainContext
+ TenantDomainContext tenantCtxt =
+ new TenantDomainContext(
+ tId,
+ domain,
+ subDomain);
+ // add it to the list
+ ctxts.add(tenantCtxt);
+ }
+
+ return ctxts;
+
+ }
+
+ /**
+ * This method will read the tenant range string and return a list of tenant ids
+ * which is derived from tenant range string.
+ *
+ * @param tenantRange
+ * @return list of tenant ids.
+ */
+ public static List<Integer> getTenantIds(String tenantRange) {
+
+ List<Integer> tenantIds = new ArrayList<Integer>();
+
+ String[] parsedLine = tenantRange.trim().split("-");
+
+ if (parsedLine[0].equalsIgnoreCase("*")) {
+ tenantIds.add(0);
+
+ } else if (parsedLine.length == 1) {
+ try {
+ int tenantId = Integer.parseInt(tenantRange);
+ tenantIds.add(tenantId);
+
+ } catch (NumberFormatException e) {
+ String msg = "Invalid tenant range is specified : " + tenantRange;
+ log.error(msg, e);
+ throw new RuntimeException(msg, e);
+ }
+ } else if (parsedLine.length == 2) {
+ try {
+
+ int startIndex = Integer.parseInt(parsedLine[0]);
+ int endIndex = Integer.parseInt(parsedLine[1]);
+
+ for (int tenantId = startIndex; tenantId <= endIndex; tenantId++) {
+
+ tenantIds.add(tenantId);
+ }
+
+ } catch (NumberFormatException e) {
+ String msg = "Invalid tenant range is specified : " + tenantRange;
+ log.error(msg, e);
+ throw new RuntimeException(msg, e);
+ }
+
+ } else {
+ String msg = "Invalid tenant range is specified : " + tenantRange;
+ log.error(msg);
+ throw new RuntimeException(msg);
+ }
+
+ return tenantIds;
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/384b3de9/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/TenantDomainContext.java
----------------------------------------------------------------------
diff --git a/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/TenantDomainContext.java b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/TenantDomainContext.java
new file mode 100644
index 0000000..fdb893e
--- /dev/null
+++ b/components/load-balancer/org.wso2.carbon.lb.common/4.1.3/src/main/java/org/wso2/carbon/lb/common/conf/util/TenantDomainContext.java
@@ -0,0 +1,79 @@
+/*
+* Copyright (c) 2005-2011, 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.lb.common.conf.util;
+
+/**
+ * This object will hold all the data related to a tenant.
+ */
+public class TenantDomainContext {
+
+ /**
+ * this is the unique identifier for this object
+ */
+ private int tenantId;
+
+ /**
+ * Domain, which this tenant belongs to.
+ */
+ private String domain;
+
+ /**
+ * Sub domain, which this tenant belongs to.
+ */
+ private String subDomain;
+
+ public TenantDomainContext(int tenantId, String domain, String subDomain) {
+ this.tenantId = tenantId;
+ this.domain = domain;
+ this.subDomain = subDomain;
+ }
+
+
+ /** Getters and Setters **/
+
+ public int getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(int tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ public String getSubDomain() {
+ return subDomain;
+ }
+
+ public void setSubDomain(String subDomain) {
+ this.subDomain = subDomain;
+ }
+
+
+ /** End of Getters and Setters **/
+
+
+
+
+}