195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddpackage com.bumptech.glide.provider;
295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddimport com.bumptech.glide.DataLoadProvider;
495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddimport java.util.HashMap;
695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddimport java.util.Map;
795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Juddpublic class DataLoadProviderFactory {
995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private static final MultiClassKey GET_KEY = new MultiClassKey();
1095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
1195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private static class MultiClassKey {
1295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        private Class dataClass;
1395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        private Class resourceClass;
1495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
1595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public MultiClassKey() { }
1695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
1795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public MultiClassKey(Class dataClass, Class resourceClass) {
1895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            this.dataClass = dataClass;
1995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            this.resourceClass = resourceClass;
2095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
2195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
2295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        @Override
2395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public String toString() {
2495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            return "MultiClassKey{" +
2595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                    "dataClass=" + dataClass +
2695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                    ", resourceClass=" + resourceClass +
2795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                    '}';
2895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
2995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
3095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        @Override
3195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public boolean equals(Object o) {
3295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            if (this == o) {
3395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                return true;
3495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            }
3595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            if (o == null || getClass() != o.getClass()) {
3695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                return false;
3795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            }
3895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
3995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            MultiClassKey that = (MultiClassKey) o;
4095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
4195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            if (!dataClass.equals(that.dataClass)) {
4295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                return false;
4395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            }
4495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            if (!resourceClass.equals(that.resourceClass)) {
4595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd                return false;
4695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            }
4795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
4895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            return true;
4995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
5095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
5195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        @Override
5295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public int hashCode() {
5395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            int result = dataClass.hashCode();
5495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            result = 31 * result + resourceClass.hashCode();
5595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            return result;
5695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
5795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
5895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        public void set(Class dataClass, Class resourceClass) {
5995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            this.dataClass = dataClass;
6095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd            this.resourceClass = resourceClass;
6195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
6295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    }
6395800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
6495800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    private final Map<MultiClassKey, DataLoadProvider> providers = new HashMap<MultiClassKey, DataLoadProvider>();
6595800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
6695800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    public <T, Z> void register(Class<T> dataClass, Class<Z> resourceClass, DataLoadProvider provider) {
6795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        providers.put(new MultiClassKey(dataClass, resourceClass), provider);
6895800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    }
6995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd
7095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    @SuppressWarnings("unchecked")
7195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    public <T, Z> DataLoadProvider<T, Z> get(Class<T> dataClass, Class<Z> resourceClass) {
722f7d83a1581be77878112d11046e3efd642e8e16Alan Newberger        DataLoadProvider<T, Z> result;
732f7d83a1581be77878112d11046e3efd642e8e16Alan Newberger        synchronized (GET_KEY) {
742f7d83a1581be77878112d11046e3efd642e8e16Alan Newberger            GET_KEY.set(dataClass, resourceClass);
752f7d83a1581be77878112d11046e3efd642e8e16Alan Newberger            result = providers.get(GET_KEY);
762f7d83a1581be77878112d11046e3efd642e8e16Alan Newberger        }
7795800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        if (result == null) {
78d3bd0a915d197e08dc7d2c7cf97fb0ee77049f51Sam Judd            result = EmptyDataLoadProvider.get();
7995800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        }
8095800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd        return result;
8195800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd    }
8295800ddedeb8ed0390310ff80a68d3d0eeef00baSam Judd}
83