package com.octo.android.robospice.persistence; import java.util.List; import android.app.Application; import com.octo.android.robospice.persistence.exception.CacheCreationException; /** * Super class of all factories of {@link ObjectPersisterFactory} classes. They * are responsible for creating {@link ObjectPersister} classes that will * save/load data for a given class. Such factories are useful because we * sometimes need to create {@link ObjectPersister} dynamically. For instance * when we serialize items as JSON, we need to create a new * {@link ObjectPersister} class for every class of items saved/loaded into * cache. A unique {@link ObjectPersister} would not be able to strongly type * the load/save method and we would have to cast the result of both operations, * leading to less robust and less convenient code. * @author sni */ public abstract class ObjectPersisterFactory implements Persister { private Application mApplication; private boolean isAsyncSaveEnabled; private List<Class<?>> listHandledClasses; /** * Creates an {@link ObjectPersisterFactory} given an Android application. * As no list of handled classes is specified, it will act has if it can * handle all classes. * @param application * the android context needed to access android file system or * databases to store. */ public ObjectPersisterFactory(Application application) { this(application, null); } /** * Creates an {@link ObjectPersisterFactory} given an Android application * and a list of handled classes. * @param application * the android context needed to access android file system or * databases to store. * @param listHandledClasses * the list of classes that is handled by the factory. The * factory will try to produce an {@link ObjectPersister} for * each element of the list. */ public ObjectPersisterFactory(Application application, List<Class<?>> listHandledClasses) { this.mApplication = application; this.listHandledClasses = listHandledClasses; } protected final Application getApplication() { return mApplication; } /** * Wether or not this bus element can persist/unpersist objects of the given * class clazz. * @param clazz * the class of objets we are looking forward to persist. * @return true if this bus element can persist/unpersist objects of the * given class clazz. False otherwise. */ @Override public boolean canHandleClass(Class<?> clazz) { if (listHandledClasses == null) { return true; } else { return listHandledClasses.contains(clazz); } } /** * Creates a {@link ObjectPersister} for a given class. * @param clazz * the class of the items that need to be saved/loaded from * cache. * @return a {@link ObjectPersister} able to load/save instances of class * clazz. * @throws CacheCreationException * if the persist fails to create its cache (it may also create * it later, but it is suggested to fail as fast as possible). */ public abstract <DATA> ObjectPersister<DATA> createObjectPersister(Class<DATA> clazz) throws CacheCreationException; /** * Set whether this {@link ObjectPersisterFactory} will set the * {@link ObjectPersister} instances it produces to save data asynchronously * or not. * @param isAsyncSaveEnabled * whether or not data will be saved asynchronously by * {@link ObjectPersister} instances produced by this factory. */ public void setAsyncSaveEnabled(boolean isAsyncSaveEnabled) { this.isAsyncSaveEnabled = isAsyncSaveEnabled; } /** * Indicates whether this {@link ObjectPersisterFactory} will set the * {@link ObjectPersister} instances it produces to save data asynchronously * or not. * @return true if the {@link ObjectPersister} instances it produces to save * data asynchronously. False otherwise. */ public boolean isAsyncSaveEnabled() { return isAsyncSaveEnabled; } /** * Return the list of classes persisted by this factory. * @return the list of classes persisted by this factory. */ protected List<Class<?>> getListHandledClasses() { return listHandledClasses; } }