package com.octo.android.robospice.persistence;

import java.util.List;

import android.app.Application;

import com.octo.android.robospice.persistence.exception.CacheLoadingException;
import com.octo.android.robospice.persistence.exception.CacheSavingException;

/**
 * Super class of all entities responsible for loading/saving objects of a given
 * class in the cache.
 * @author sni
 * @param <T>
 *            the class of the objects this {@link ObjectPersister} can
 *            persist/unpersist.
 */
public abstract class ObjectPersister<T> implements Persister, CacheCleaner {

    private boolean isAsyncSaveEnabled;
    private Application application;
    private Class<T> clazz;

    public ObjectPersister(Application application, Class<T> clazz) {
        this.application = application;
        this.clazz = clazz;
    }

    public Application getApplication() {
        return application;
    }

    public Class<T> getHandledClass() {
        return clazz;
    }

    @Override
    public boolean canHandleClass(Class<?> clazz) {
        return clazz.equals(this.clazz);
    }

    /**
     * Load data from cache if not expired.
     * @param cacheKey
     *            the cacheKey of the data to load.
     * @param maxTimeInCache
     *            the maximum time the data can have been stored in cached
     *            before being considered expired. 0 means infinite.
     * @return the data if it could be loaded.
     * @throws CacheExpiredException
     *             if the data in cache is expired.
     */
    public abstract T loadDataFromCache(Object cacheKey, long maxTimeInCache) throws CacheLoadingException;

    public abstract List<T> loadAllDataFromCache() throws CacheLoadingException;

    public abstract List<Object> getAllCacheKeys();

    public abstract T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException;

    public abstract boolean removeDataFromCache(Object cacheKey);

    @Override
    public abstract void removeAllDataFromCache();

    /**
     * Return the creation date of creation of cache. entry for a given
     * cacheKey.
     * @param cacheKey
     *            the cachekey identifying the object to look for.
     * @return a long corresponding to the creation date of creation of cache.
     * @throws CacheLoadingException
     *             if there is no such element in cache.
     */
    public abstract long getCreationDateInCache(Object cacheKey) throws CacheLoadingException;

    public boolean isAsyncSaveEnabled() {
        return isAsyncSaveEnabled;
    }

    public void setAsyncSaveEnabled(boolean isAsyncSaveEnabled) {
        this.isAsyncSaveEnabled = isAsyncSaveEnabled;
    }

    public abstract boolean isDataInCache(Object cacheKey, long maxTimeInCacheBeforeExpiry);

}

package com.octo.android.robospice.persistence;

import java.util.List;

import android.app.Application;

import com.octo.android.robospice.persistence.exception.CacheLoadingException;
import com.octo.android.robospice.persistence.exception.CacheSavingException;

/**
 * Super class of all entities responsible for loading/saving objects of a given
 * class in the cache.
 * @author sni
 * @param <T>
 *            the class of the objects this {@link ObjectPersister} can
 *            persist/unpersist.
 */
public abstract class ObjectPersister<T> implements Persister, CacheCleaner {

    private boolean isAsyncSaveEnabled;
    private Application application;
    private Class<T> clazz;

    public ObjectPersister(Application application, Class<T> clazz) {
        this.application = application;
        this.clazz = clazz;
    }

    public Application getApplication() {
        return application;
    }

    public Class<T> getHandledClass() {
        return clazz;
    }

    @Override
    public boolean canHandleClass(Class<?> clazz) {
        return clazz.equals(this.clazz);
    }

    /**
     * Load data from cache if not expired.
     * @param cacheKey
     *            the cacheKey of the data to load.
     * @param maxTimeInCache
     *            the maximum time the data can have been stored in cached
     *            before being considered expired. 0 means infinite.
     * @return the data if it could be loaded.
     * @throws CacheLoadingException
     *             if the data in cache is expired.
     */
    public abstract T loadDataFromCache(Object cacheKey, long maxTimeInCache) throws CacheLoadingException;

    public abstract List<T> loadAllDataFromCache() throws CacheLoadingException;

    public abstract List<Object> getAllCacheKeys();

    public abstract T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException;

    public abstract boolean removeDataFromCache(Object cacheKey);

    @Override
    public abstract void removeAllDataFromCache();

    /**
     * Return the creation date of creation of cache. entry for a given
     * cacheKey.
     * @param cacheKey
     *            the cachekey identifying the object to look for.
     * @return a long corresponding to the creation date of creation of cache.
     * @throws CacheLoadingException
     *             if there is no such element in cache.
     */
    public abstract long getCreationDateInCache(Object cacheKey) throws CacheLoadingException;

    public boolean isAsyncSaveEnabled() {
        return isAsyncSaveEnabled;
    }

    public void setAsyncSaveEnabled(boolean isAsyncSaveEnabled) {
        this.isAsyncSaveEnabled = isAsyncSaveEnabled;
    }

    public abstract boolean isDataInCache(Object cacheKey, long maxTimeInCacheBeforeExpiry);

}

Rename Exception thrower for JavaDoc