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