blob: 83acb5cd1479284a7c896d7f667775739da7c8f5 [file] [log] [blame]
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;
}
}