1package com.bumptech.glide.provider;
2
3import com.bumptech.glide.DataLoadProvider;
4
5import java.util.HashMap;
6import java.util.Map;
7
8public class DataLoadProviderFactory {
9    private static final MultiClassKey GET_KEY = new MultiClassKey();
10
11    private static class MultiClassKey {
12        private Class dataClass;
13        private Class resourceClass;
14
15        public MultiClassKey() { }
16
17        public MultiClassKey(Class dataClass, Class resourceClass) {
18            this.dataClass = dataClass;
19            this.resourceClass = resourceClass;
20        }
21
22        @Override
23        public String toString() {
24            return "MultiClassKey{" +
25                    "dataClass=" + dataClass +
26                    ", resourceClass=" + resourceClass +
27                    '}';
28        }
29
30        @Override
31        public boolean equals(Object o) {
32            if (this == o) {
33                return true;
34            }
35            if (o == null || getClass() != o.getClass()) {
36                return false;
37            }
38
39            MultiClassKey that = (MultiClassKey) o;
40
41            if (!dataClass.equals(that.dataClass)) {
42                return false;
43            }
44            if (!resourceClass.equals(that.resourceClass)) {
45                return false;
46            }
47
48            return true;
49        }
50
51        @Override
52        public int hashCode() {
53            int result = dataClass.hashCode();
54            result = 31 * result + resourceClass.hashCode();
55            return result;
56        }
57
58        public void set(Class dataClass, Class resourceClass) {
59            this.dataClass = dataClass;
60            this.resourceClass = resourceClass;
61        }
62    }
63
64    private final Map<MultiClassKey, DataLoadProvider> providers = new HashMap<MultiClassKey, DataLoadProvider>();
65
66    public <T, Z> void register(Class<T> dataClass, Class<Z> resourceClass, DataLoadProvider provider) {
67        providers.put(new MultiClassKey(dataClass, resourceClass), provider);
68    }
69
70    @SuppressWarnings("unchecked")
71    public <T, Z> DataLoadProvider<T, Z> get(Class<T> dataClass, Class<Z> resourceClass) {
72        DataLoadProvider<T, Z> result;
73        synchronized (GET_KEY) {
74            GET_KEY.set(dataClass, resourceClass);
75            result = providers.get(GET_KEY);
76        }
77        if (result == null) {
78            result = EmptyDataLoadProvider.get();
79        }
80        return result;
81    }
82}
83