package com.bumptech.glide.provider; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.util.Synthetic; import java.util.ArrayList; import java.util.List; /** * Contains an ordered list of {@link ResourceDecoder}s capable of decoding arbitrary data types * into arbitrary resource types from highest priority decoders to lowest priority decoders. */ @SuppressWarnings("rawtypes") public class ResourceDecoderRegistry { private final List<Entry<?, ?>> decoders = new ArrayList<>(); @SuppressWarnings("unchecked") public synchronized <T, R> List<ResourceDecoder<T, R>> getDecoders(Class<T> dataClass, Class<R> resourceClass) { List<ResourceDecoder<T, R>> result = new ArrayList<>(); for (Entry<?, ?> entry : decoders) { if (entry.handles(dataClass, resourceClass)) { result.add((ResourceDecoder<T, R>) entry.decoder); } } // TODO: cache result list. return result; } @SuppressWarnings("unchecked") public synchronized <T, R> List<Class<R>> getResourceClasses(Class<T> dataClass, Class<R> resourceClass) { List<Class<R>> result = new ArrayList<>(); for (Entry<?, ?> entry : decoders) { if (entry.handles(dataClass, resourceClass)) { result.add((Class<R>) entry.resourceClass); } } return result; } public synchronized <T, R> void append(ResourceDecoder<T, R> decoder, Class<T> dataClass, Class<R> resourceClass) { decoders.add(new Entry<>(dataClass, resourceClass, decoder)); } public synchronized <T, R> void prepend(ResourceDecoder<T, R> decoder, Class<T> dataClass, Class<R> resourceClass) { decoders.add(0, new Entry<>(dataClass, resourceClass, decoder)); } private static class Entry<T, R> { private final Class<T> dataClass; @Synthetic final Class<R> resourceClass; @Synthetic final ResourceDecoder<T, R> decoder; public Entry(Class<T> dataClass, Class<R> resourceClass, ResourceDecoder<T, R> decoder) { this.dataClass = dataClass; this.resourceClass = resourceClass; this.decoder = decoder; } public boolean handles(Class<?> dataClass, Class<?> resourceClass) { return this.dataClass.isAssignableFrom(dataClass) && resourceClass .isAssignableFrom(this.resourceClass); } } }