/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.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 com.linkedin.pinot.routing;
import org.apache.commons.configuration.Configuration;
import org.apache.helix.ZNRecord;
import org.apache.helix.store.zk.ZkHelixPropertyStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RoutingTableSelectorFactory {
private static Logger LOGGER = LoggerFactory.getLogger(RoutingTableSelectorFactory.class);
private static String CLASSNAME_KEY = "class";
private static String defaultClasssName = PercentageBasedRoutingTableSelector.class.getName();
/*
* "class" indicates the class to load. If it is null, the load the default class. with the configuration as
* constructor.
*/
public static RoutingTableSelector getRoutingTableSelector(Configuration config,
ZkHelixPropertyStore<ZNRecord> propertyStore) {
RoutingTableSelector routingTableSelector = new PercentageBasedRoutingTableSelector();
if (config == null) {
LOGGER.warn("No config for routing table selector. Using default");
} else {
String selectorClassName = null;
try {
selectorClassName = (String) config.getProperty(CLASSNAME_KEY);
} catch (Exception e) {
LOGGER.warn("Could not parse property '{}'. Using {}", CLASSNAME_KEY, defaultClasssName, e);
}
Class<? extends RoutingTableSelector> clazz;
if (selectorClassName == null || selectorClassName.isEmpty()) {
LOGGER.info("Null or empty selector class name. Using default");
} else {
try {
clazz = (Class<? extends RoutingTableSelector>) Class.forName(selectorClassName);
routingTableSelector = clazz.newInstance();
} catch (ClassNotFoundException e) {
LOGGER.warn("Could not load '{}'. Loading {}", selectorClassName, defaultClasssName, e);
} catch (InstantiationException e) {
LOGGER.warn("Could not instantiate '{}'. Instantiating {}", selectorClassName, defaultClasssName, e);
} catch (IllegalAccessException e) {
LOGGER.warn("Could not instantiate '{}'. Instantiating {}", selectorClassName, defaultClasssName, e);
}
}
}
routingTableSelector.init(config, propertyStore);
return routingTableSelector;
}
}