blob: 95c9981db231fe67bbca579b3838f2a8d2df751f [file] [log] [blame]
package org.apache.bookkeeper.feature;
/*
*
* 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.
*
*/
import org.apache.commons.lang.StringUtils;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
* Cacheable Feature Provider
*/
public abstract class CacheableFeatureProvider<T extends Feature> implements FeatureProvider {
protected final String scope;
protected final ConcurrentMap<String, FeatureProvider> scopes =
new ConcurrentHashMap<String, FeatureProvider>();
protected final ConcurrentMap<String, T> features =
new ConcurrentHashMap<String, T>();
protected CacheableFeatureProvider(String scope) {
this.scope = scope;
}
protected String makeName(String name) {
if (StringUtils.isBlank(scope)) {
return name;
} else {
return scope + "." + name;
}
}
@Override
public T getFeature(String name) {
T feature = features.get(name);
if (null == feature) {
T newFeature = makeFeature(makeName(name));
T oldFeature = features.putIfAbsent(name, newFeature);
if (null == oldFeature) {
feature = newFeature;
} else {
feature = oldFeature;
}
}
return feature;
}
protected abstract T makeFeature(String featureName);
@Override
public FeatureProvider scope(String name) {
FeatureProvider provider = scopes.get(name);
if (null == provider) {
FeatureProvider newProvider = makeProvider(makeName(name));
FeatureProvider oldProvider = scopes.putIfAbsent(name, newProvider);
if (null == oldProvider) {
provider = newProvider;
} else {
provider = oldProvider;
}
}
return provider;
}
protected abstract FeatureProvider makeProvider(String fullScopeName);
}