package com.bumptech.glide.load.data; import com.bumptech.glide.util.Preconditions; import java.util.HashMap; import java.util.Map; /** * Stores a mapping of data class to {@link com.bumptech.glide.load.data.DataRewinder.Factory} and * allows registration of new types and factories. */ public class DataRewinderRegistry { private final Map<Class<?>, DataRewinder.Factory<?>> rewinders = new HashMap<>(); private static final DataRewinder.Factory<?> DEFAULT_FACTORY = new DataRewinder.Factory<Object>() { @Override public DataRewinder<Object> build(Object data) { return new DefaultRewinder(data); } @Override public Class<Object> getDataClass() { throw new UnsupportedOperationException("Not implemented"); } }; public synchronized void register(DataRewinder.Factory<?> factory) { rewinders.put(factory.getDataClass(), factory); } @SuppressWarnings("unchecked") public synchronized <T> DataRewinder<T> build(T data) { Preconditions.checkNotNull(data); DataRewinder.Factory<T> result = (DataRewinder.Factory<T>) rewinders.get(data.getClass()); if (result == null) { for (DataRewinder.Factory<?> registeredFactory : rewinders.values()) { if (registeredFactory.getDataClass().isAssignableFrom(data.getClass())) { result = (DataRewinder.Factory<T>) registeredFactory; break; } } } if (result == null) { result = (DataRewinder.Factory<T>) DEFAULT_FACTORY; } return result.build(data); } private static class DefaultRewinder implements DataRewinder<Object> { private final Object data; public DefaultRewinder(Object data) { this.data = data; } @Override public Object rewindAndGet() { return data; } @Override public void cleanup() { // Do nothing. } } }