/**
 * The contents of this file are subject to the license and copyright
 * detailed in the LICENSE and NOTICE files at the root of the source
 * tree and available online at
 *
 * http://www.dspace.org/license/
 */
package org.dspace.services.model;

/**
 * Encodes the configuration for a cache into an object.
 *
 * @author Aaron Zeckoski (azeckoski @ gmail.com)
 */
public class CacheConfig {

    /**
     * Controls the scope of each created cache.
     */
    public enum CacheScope {
        /**
         * This cache is destroyed at the end of the current request for
         * the current thread it was created in.
         */
        REQUEST,
        /**
         * This cache is destroyed when the current JVM shuts down.
         */
        INSTANCE,
        /**
         * This cache is destroyed when the entire cluster goes down.
         * The cache will invalidate the same entries in other caches
         * when it changes.
         */
        CLUSTERINVALIDATED,
        /**
         * This cache is destroyed when the entire cluster goes down.
         * The cache will copy an entry over to other caches when it
         * changes or is created.
         */
        CLUSTERREPLICATED;
    }

    ;

    /**
     * Defines the lifecycle of the cache.
     *
     * @see CacheScope
     */
    private CacheScope cacheScope;

    /**
     * @return the scope of the associated cache
     */
    public final CacheScope getCacheScope() {
        return cacheScope;
    }

    /**
     * Configure the cache to use the given scope.
     *
     * @param cacheScope defines the lifecycle of the cache
     */
    public CacheConfig(CacheScope cacheScope) {
        this.cacheScope = cacheScope;
    }

}
