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