blob: 02a4d79a3e9a5110a22a57eeb38e2d2a3b888cd8 [file] [log] [blame]
/**
* 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 com.twitter.distributedlog.feature;
import com.twitter.distributedlog.config.ConcurrentBaseConfiguration;
import org.apache.bookkeeper.feature.CacheableFeatureProvider;
import org.apache.bookkeeper.feature.Feature;
import org.apache.bookkeeper.feature.FeatureProvider;
import org.apache.bookkeeper.feature.SettableFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentMap;
/**
* Feature Provider that load features from configuration
*/
class ConfigurationFeatureProvider extends CacheableFeatureProvider {
private static final Logger logger = LoggerFactory.getLogger(ConfigurationFeatureProvider.class);
static SettableFeature makeFeature(ConcurrentBaseConfiguration featuresConf,
ConcurrentMap<String, SettableFeature> features,
String featureName) {
SettableFeature feature = features.get(featureName);
if (null == feature) {
int availability = featuresConf.getInt(featureName, 0);
feature = new SettableFeature(featureName, availability);
SettableFeature oldFeature =
features.putIfAbsent(featureName, feature);
if (null != oldFeature) {
feature = oldFeature;
} else {
logger.info("Load feature {}={}", featureName, availability);
}
}
return feature;
}
private final ConcurrentBaseConfiguration featuresConf;
private final ConcurrentMap<String, SettableFeature> features;
ConfigurationFeatureProvider(String rootScope,
ConcurrentBaseConfiguration featuresConf,
ConcurrentMap<String, SettableFeature> features) {
super(rootScope);
this.featuresConf = featuresConf;
this.features = features;
}
@Override
protected Feature makeFeature(String featureName) {
return makeFeature(featuresConf, features, featureName);
}
@Override
protected FeatureProvider makeProvider(String fullScopeName) {
return new ConfigurationFeatureProvider(
fullScopeName, featuresConf, features);
}
}