aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/filter/FilterRegistry.java
blob: d6d9db92e12079a06bd24cd60b131d4aee0c67c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package cgeo.geocaching.filter;

import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.filter.SizeFilter.Factory;

import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;

import android.content.res.Resources;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * singleton registry of all available filter components
 *
 */
public class FilterRegistry {
    private final List<FactoryEntry> registry = new ArrayList<>();
    private static Resources res;

    static class FactoryEntry {
        private final String name;
        private final @NonNull Class<? extends IFilterFactory> filterFactory;

        public FactoryEntry(final String name, final @NonNull Class<? extends IFilterFactory> filterFactory) {
            this.name = name;
            this.filterFactory = filterFactory;
        }

        @Override
        public String toString() {
            return name;
        }

        public String getName() {
            return name;
        }

        public Class<? extends IFilterFactory> getFactory() {
            return filterFactory;
        }
    }

    private static class SingletonHolder {
        private static final FilterRegistry INSTANCE = new FilterRegistry();
    }

    public static FilterRegistry getInstance() {
        return SingletonHolder.INSTANCE;
    }

    private FilterRegistry() {
        res = CgeoApplication.getInstance().getResources();
        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);
    }

    private void register(final int resourceId, final @NonNull Class<? extends IFilterFactory> factoryClass) {
        registry.add(new FactoryEntry(res.getString(resourceId), factoryClass));
    }

    public String getFactoryName(final Class<Factory> factoryClass) {
        for (final FactoryEntry entry : registry) {
            if (entry.filterFactory == factoryClass) {
                return entry.name;
            }
        }
        return StringUtils.EMPTY;
    }

    public List<FactoryEntry> getFactories() {
        return Collections.unmodifiableList(registry);
    }
}