15f4610b54d517be58105bcf73ce3291ba79f9f40Sam Juddpackage com.bumptech.glide.load.resource.transcode;
25f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd
31e5d51a9dd0bbde1f974675c16372a4f97126872Robert Pappimport com.bumptech.glide.util.MultiClassKey;
41e5d51a9dd0bbde1f974675c16372a4f97126872Robert Papp
55f4610b54d517be58105bcf73ce3291ba79f9f40Sam Juddimport java.util.HashMap;
65f4610b54d517be58105bcf73ce3291ba79f9f40Sam Juddimport java.util.Map;
75f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd
85f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd/**
95f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd * A class that allows {@link com.bumptech.glide.load.resource.transcode.ResourceTranscoder}s to be registered and
105f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd * retrieved by the classes they convert between.
115f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd */
125f4610b54d517be58105bcf73ce3291ba79f9f40Sam Juddpublic class TranscoderRegistry {
135f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    private static final MultiClassKey GET_KEY = new MultiClassKey();
145f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd
158acb4cc63588cdf595357bb60ac1ac79d3985893Robert Papp    private final Map<MultiClassKey, ResourceTranscoder<?, ?>> factories =
168acb4cc63588cdf595357bb60ac1ac79d3985893Robert Papp            new HashMap<MultiClassKey, ResourceTranscoder<?, ?>>();
175f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd
185f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    /**
195f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * Registers the given {@link com.bumptech.glide.load.resource.transcode.ResourceTranscoder} using the given
205f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * classes so it can later be retrieved using the given classes.
215f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     *
225f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param decodedClass The class of the resource that the transcoder transcodes from.
235f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param transcodedClass The class of the resource that the transcoder transcodes to.
245f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param transcoder The transcoder.
255f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param <Z> The type of the resource that the transcoder transcodes from.
265f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param <R> The type of the resource that the transcoder transcodes to.
275f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     */
285f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    public <Z, R> void register(Class<Z> decodedClass, Class<R> transcodedClass, ResourceTranscoder<Z, R> transcoder) {
295f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd        factories.put(new MultiClassKey(decodedClass, transcodedClass), transcoder);
305f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    }
315f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd
325f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    /**
335f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * Returns the currently registered {@link com.bumptech.glide.load.resource.transcode.ResourceTranscoder} for the
345f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * given classes.
355f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     *
365f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param decodedClass The class of the resource that the transcoder transcodes from.
375f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param transcodedClass The class of the resource that the transcoder transcodes to.
385f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param <Z> The type of the resource that the transcoder transcodes from.
395f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     * @param <R> The type of the resource that the transcoder transcodes to.
405f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd     */
415f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    @SuppressWarnings("unchecked")
425f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    public <Z, R> ResourceTranscoder<Z, R> get(Class<Z> decodedClass, Class<R> transcodedClass) {
435f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd        if (decodedClass.equals(transcodedClass)) {
448acb4cc63588cdf595357bb60ac1ac79d3985893Robert Papp            // we know they're the same type (Z and R)
458acb4cc63588cdf595357bb60ac1ac79d3985893Robert Papp            return (ResourceTranscoder<Z, R>) UnitTranscoder.get();
465f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd        }
47b6a75caaecf84103616b1b6deb71b2f2ba19b4b3Sam Judd        final ResourceTranscoder<?, ?> result;
48b6a75caaecf84103616b1b6deb71b2f2ba19b4b3Sam Judd        synchronized (GET_KEY) {
49b6a75caaecf84103616b1b6deb71b2f2ba19b4b3Sam Judd            GET_KEY.set(decodedClass, transcodedClass);
50b6a75caaecf84103616b1b6deb71b2f2ba19b4b3Sam Judd            result = factories.get(GET_KEY);
51b6a75caaecf84103616b1b6deb71b2f2ba19b4b3Sam Judd        }
525f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd        if (result == null) {
535f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd            throw new IllegalArgumentException("No transcoder registered for " + decodedClass + " and "
545f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd                    + transcodedClass);
555f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd        }
568acb4cc63588cdf595357bb60ac1ac79d3985893Robert Papp        return (ResourceTranscoder<Z, R>) result;
575f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd    }
585f4610b54d517be58105bcf73ce3291ba79f9f40Sam Judd}
59