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