Home | History | Annotate | Download | only in provider
      1 package com.bumptech.glide.provider;
      2 
      3 import com.bumptech.glide.util.MultiClassKey;
      4 
      5 import java.util.HashMap;
      6 import java.util.Map;
      7 
      8 /**
      9  * A class that allows {@link com.bumptech.glide.provider.DataLoadProvider}s to be registered and retrieved by the
     10  * data and resource classes they provide encoders and decoders for.
     11  */
     12 public class DataLoadProviderRegistry {
     13     private static final MultiClassKey GET_KEY = new MultiClassKey();
     14 
     15     private final Map<MultiClassKey, DataLoadProvider<?, ?>> providers =
     16             new HashMap<MultiClassKey, DataLoadProvider<?, ?>>();
     17 
     18     /**
     19      * Registers the given {@link com.bumptech.glide.provider.DataLoadProvider} using the given classes so it can later
     20      * be retrieved using the given classes.
     21      *
     22      * @param dataClass The class of the data that the provider provides encoders and decoders for.
     23      * @param resourceClass The class of the resource that the provider provides encoders and decoders for.
     24      * @param provider The provider.
     25      * @param <T> The type of the data that the provider provides encoders and decoders for.
     26      * @param <Z> The type of the resource that the provider provides encoders and decoders for.
     27      */
     28     public <T, Z> void register(Class<T> dataClass, Class<Z> resourceClass, DataLoadProvider<T, Z> provider) {
     29         //TODO: maybe something like DataLoadProvider<? super T, ? extends Z> may work here
     30         providers.put(new MultiClassKey(dataClass, resourceClass), provider);
     31     }
     32 
     33     /**
     34      * Returns the currently registered {@link com.bumptech.glide.provider.DataLoadProvider} for the given classes.
     35      *
     36      * @param dataClass The class of the data that the provider provides encoders and decoders for.
     37      * @param resourceClass The class of the resource that the provider provides encoders and decoders for.
     38      * @param <T> The type of the data that the provider provides encoders and decoders for.
     39      * @param <Z> The type of the resource that the provider provides encoders and decoders for.
     40      */
     41     @SuppressWarnings("unchecked")
     42     public <T, Z> DataLoadProvider<T, Z> get(Class<T> dataClass, Class<Z> resourceClass) {
     43         DataLoadProvider<?, ?> result;
     44         synchronized (GET_KEY) {
     45             GET_KEY.set(dataClass, resourceClass);
     46             result = providers.get(GET_KEY);
     47         }
     48         if (result == null) {
     49             result = EmptyDataLoadProvider.get();
     50         }
     51         return (DataLoadProvider<T, Z>) result;
     52     }
     53 }
     54