package cgeo.geocaching.filter;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.filter.SizeFilter.Factory;
import android.content.res.Resources;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
/**
* singleton registry of all available filter components
*
*/
public class FilterRegistry {
static class FactoryEntry {
private final String name;
@NonNull private final Class<? extends IFilterFactory> filterFactory;
FactoryEntry(final String name, @NonNull final Class<? extends IFilterFactory> filterFactory) {
this.name = name;
this.filterFactory = filterFactory;
}
public Class<? extends IFilterFactory> getFactory() {
return filterFactory;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
private static class SingletonHolder {
private static final FilterRegistry INSTANCE = new FilterRegistry();
}
public static FilterRegistry getInstance() {
return SingletonHolder.INSTANCE;
}
private final List<FactoryEntry> registry = new ArrayList<>();
private FilterRegistry() {
register(R.string.caches_filter_type, TypeFilter.Factory.class);
register(R.string.caches_filter_size, SizeFilter.Factory.class);
register(R.string.cache_terrain, TerrainFilter.Factory.class);
register(R.string.cache_difficulty, DifficultyFilter.Factory.class);
register(R.string.cache_attributes, AttributeFilter.Factory.class);
register(R.string.cache_status, StateFilterFactory.class);
register(R.string.caches_filter_origin, OriginFilter.Factory.class);
register(R.string.caches_filter_distance, DistanceFilter.Factory.class);
register(R.string.caches_filter_popularity, PopularityFilter.Factory.class);
register(R.string.caches_filter_popularity_ratio, PopularityRatioFilter.Factory.class);
register(R.string.caches_filter_personal_data, PersonalDataFilterFactory.class);
}
public List<FactoryEntry> getFactories() {
return Collections.unmodifiableList(registry);
}
public String getFactoryName(final Class<Factory> factoryClass) {
for (final FactoryEntry entry : registry) {
if (entry.filterFactory == factoryClass) {
return entry.name;
}
}
return StringUtils.EMPTY;
}
private void register(@StringRes final int resourceId, @NonNull final Class<? extends IFilterFactory> factoryClass) {
final Resources res = CgeoApplication.getInstance().getResources();
registry.add(new FactoryEntry(res.getString(resourceId), factoryClass));
}
}