| package com.bumptech.glide.load.resource.transcode; |
| |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| public class TranscoderFactory { |
| private static final MultiClassKey GET_KEY = new MultiClassKey(); |
| |
| private static class MultiClassKey { |
| private Class decoded; |
| private Class transcoded; |
| |
| public MultiClassKey() {} |
| |
| public MultiClassKey(Class decoded, Class transcoded) { |
| this.decoded = decoded; |
| this.transcoded = transcoded; |
| } |
| |
| public void set(Class decoded, Class transcoded) { |
| this.decoded = decoded; |
| this.transcoded = transcoded; |
| } |
| |
| @Override |
| public String toString() { |
| return "MultiClassKey{" + |
| "decoded=" + decoded + |
| ", transcoded=" + transcoded + |
| '}'; |
| } |
| |
| @Override |
| public boolean equals(Object o) { |
| if (this == o) { |
| return true; |
| } |
| if (o == null || getClass() != o.getClass()) { |
| return false; |
| } |
| |
| MultiClassKey that = (MultiClassKey) o; |
| |
| if (!decoded.equals(that.decoded)) { |
| return false; |
| } |
| if (!transcoded.equals(that.transcoded)) { |
| return false; |
| } |
| |
| return true; |
| } |
| |
| @Override |
| public int hashCode() { |
| int result = decoded.hashCode(); |
| result = 31 * result + transcoded.hashCode(); |
| return result; |
| } |
| } |
| |
| private Map<MultiClassKey, ResourceTranscoder> factories = new HashMap<MultiClassKey, ResourceTranscoder>(); |
| |
| public <Z, R> void register(Class<Z> decodedClass, Class<R> transcodedClass, ResourceTranscoder<Z, R> factory) { |
| factories.put(new MultiClassKey(decodedClass, transcodedClass), factory); |
| } |
| |
| @SuppressWarnings("unchecked") |
| public <Z, R> ResourceTranscoder<Z, R> get(Class<Z> decodedClass, Class<R> transcodedClass) { |
| if (decodedClass.equals(transcodedClass)) { |
| return UnitTranscoder.get(); |
| } |
| ResourceTranscoder<Z, R> result; |
| synchronized (GET_KEY) { |
| GET_KEY.set(decodedClass, transcodedClass); |
| result = factories.get(GET_KEY); |
| } |
| if (result == null) { |
| throw new IllegalArgumentException("No transcoder registered for " + decodedClass + " and " |
| + transcodedClass); |
| } |
| return result; |
| } |
| } |