All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.ehcache.config.TerracottaConfiguration Maven / Gradle / Ivy

/**
 *  Copyright Terracotta, Inc.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package net.sf.ehcache.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Class to hold the Terracotta configuration - either a pointer to the real config or a
 * container for embedded config.
 *
 * @author Alex Miller
 * @author Geert Bevin
 * @author Abhishek Sanoujam
 */
public class TerracottaConfiguration implements Cloneable {

    /**
     * Default clustered mode
     */
    public static final boolean DEFAULT_CLUSTERED = true;
    /**
     * Default value mode
     */
    public static final ValueMode DEFAULT_VALUE_MODE = ValueMode.SERIALIZATION;
    /**
     * Default coherent read behavior
     */
    public static final boolean DEFAULT_COHERENT_READS = true;
    /**
     * Default xa enabled
     */
    public static final boolean DEFAULT_CACHE_XA = false;
    /**
     * Default orphan eviction status
     */
    public static final boolean DEFAULT_ORPHAN_EVICTION = true;
    /**
     * Default orphan eviction period
     */
    public static final int DEFAULT_ORPHAN_EVICTION_PERIOD = 4;
    /**
     * Default local key cache status
     */
    public static final boolean DEFAULT_LOCAL_KEY_CACHE = false;
    /**
     * Default local key cache size
     */
    public static final int DEFAULT_LOCAL_KEY_CACHE_SIZE = 300000;
    /**
     * Default copy on read setting
     */
    public static final boolean DEFAULT_COPY_ON_READ = false;
    /**
     * Default compression setting
     */
    public static final boolean DEFAULT_COMPRESSION_ENABLED = false;

    /**
     * Default value for {@link NonstopConfiguration}
     */
    public static final NonstopConfiguration DEFAULT_NON_STOP_CONFIGURATION = makeDefaultNonstopConfiguration();

    /**
     * Default cache coherence setting
     *
     * @deprecated since 2.4 Use {@link #DEFAULT_CONSISTENCY_TYPE} instead.
     */
    @Deprecated
    public static final boolean DEFAULT_CACHE_COHERENT = true;

    /**
     * Default cache consistency setting
     */
    public static final Consistency DEFAULT_CONSISTENCY_TYPE = Consistency.EVENTUAL;

    /**
     * Default setting for synchronous-write
     */
    public static final boolean DEFAULT_SYNCHRONOUS_WRITES = false;

    /**
     * Default value for concurrency of the internal Store.
     */
    public static final int DEFAULT_CONCURRENCY = 0;


    /**
     * Default value for whether local cache is enabled or not
     */
    public static final boolean DEFAULT_LOCAL_CACHE_ENABLED = true;

    /**
     * Represents whether values are stored with serialization in the clustered store
     * or through Terracotta clustered identity.
     *
     * @author amiller
     */
    public static enum ValueMode {
        /**
         * When a key or value is put in the cache, serialize the data for sending around the cluster
         */
        SERIALIZATION,

        /**
         * Use Terracotta clustered identity to preserve object identity without serialization
         */
        IDENTITY,
    }

    private static final Logger LOG = LoggerFactory.getLogger(TerracottaConfiguration.class.getName());

    private boolean clustered = DEFAULT_CLUSTERED;
    private ValueMode valueMode = DEFAULT_VALUE_MODE;
    private boolean coherentReads = DEFAULT_COHERENT_READS;
    private boolean orphanEviction = DEFAULT_ORPHAN_EVICTION;
    private int orphanEvictionPeriod = DEFAULT_ORPHAN_EVICTION_PERIOD;
    private boolean localKeyCache = DEFAULT_LOCAL_KEY_CACHE;
    private int localKeyCacheSize = DEFAULT_LOCAL_KEY_CACHE_SIZE;
    private boolean isCopyOnRead = DEFAULT_COPY_ON_READ;
    private boolean cacheXA = DEFAULT_CACHE_XA;
    private boolean synchronousWrites = DEFAULT_SYNCHRONOUS_WRITES;
    private int concurrency = DEFAULT_CONCURRENCY;
    private NonstopConfiguration nonStopConfiguration = makeDefaultNonstopConfiguration();

    private boolean copyOnReadSet;
    private Consistency consistency = DEFAULT_CONSISTENCY_TYPE;
    private volatile boolean localCacheEnabled = DEFAULT_LOCAL_CACHE_ENABLED;
    private volatile boolean compressionEnabled = DEFAULT_COMPRESSION_ENABLED;

    /**
     * Clones this object, following the usual contract.
     *
     * @return a copy, which independent other than configurations than cannot change.
     */
    @Override
    public TerracottaConfiguration clone() {
        try {
            TerracottaConfiguration clone = (TerracottaConfiguration) super.clone();
            if (nonStopConfiguration != null) {
                clone.nonstop(this.nonStopConfiguration.clone());
            }
            return clone;
        } catch (CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    private void assertArgumentNotNull(String name, Object object) {
        if (object == null) {
            throw new IllegalArgumentException(name + " cannot be null");
        }
    }

    /**
     * Indicates whether to cluster this cache with Terracotta.
     * 

* Defaults to {@value #DEFAULT_CLUSTERED}. * * @param clustered * {@code true} if the cache should be clustered with Terracotta; {@code false} otherwise */ public void setClustered(boolean clustered) { this.clustered = clustered; } /** * @return this configuration instance * @see #setClustered(boolean) */ public TerracottaConfiguration clustered(boolean clustered) { setClustered(clustered); return this; } /** * Check whether clustering is enabled */ public boolean isClustered() { return this.clustered; } /** * Used by BeanHandler to set the copyOnRead flag during parsing */ public void setCopyOnRead(boolean isCopyOnRead) { LOG.warn("copyOnRead is deprecated on the element, " + "please use the copyOnRead attribute on or "); this.copyOnReadSet = true; this.isCopyOnRead = isCopyOnRead; } /** * Used by BeanHandler to set the compressionEnaled flag during parsing */ public void setCompressionEnabled(boolean enabled) { this.compressionEnabled = enabled; } /** * Whether the copyOnRead was explicitly set * * @return true if set by config */ boolean isCopyOnReadSet() { return copyOnReadSet; } /** * @return this configuration instance * @see #setCopyOnRead(boolean) */ public TerracottaConfiguration copyOnRead(boolean isCopyOnRead) { setCopyOnRead(isCopyOnRead); return this; } /** * @return this configuration instance */ public TerracottaConfiguration compressionEnabled(boolean enabled) { setCompressionEnabled(enabled); return this; } /** * Check whether the [serialized value] cache is an XA enabled cache */ public boolean isCacheXA() { return this.cacheXA; } /** * Used by BeanHandler to set the cacheXA flag during parsing */ public void setCacheXA(boolean cacheXA) { this.cacheXA = cacheXA; } /** * @return this configuration instance * @see #setCacheXA(boolean) */ public TerracottaConfiguration cacheXA(boolean cacheXA) { setCacheXA(cacheXA); return this; } /** * Check whether the [serialized value] cache should use copy on read semantics */ public boolean isCopyOnRead() { return this.isCopyOnRead; } /** * Check whether compression is enabled */ public boolean isCompressionEnabled() { return this.compressionEnabled; } /** * Sets whether this cache should use coherent reads (usually should be {@value #DEFAULT_COHERENT_READS} unless optimizing for * read-only). *

* Defaults to {@value #DEFAULT_COHERENT_READS}. * * @param coherentReads * {@code true} if coherent reads should be used; {@code false} otherwise */ public void setCoherentReads(boolean coherentReads) { LOG.warn("The attribute \"coherentReads\" in \"terracotta\" element is deprecated." + " Please use the new \"coherent\" attribute instead."); this.coherentReads = coherentReads; } /** * @return this configuration instance * @see #setCoherentReads(boolean) */ public TerracottaConfiguration coherentReads(boolean coherentReads) { setCoherentReads(coherentReads); return this; } /** * Check whether coherent reads are enabled */ public boolean getCoherentReads() { return this.coherentReads; } /** * Converts the {@code valueMode} string argument to uppercase and looks up enum constant in ValueMode. */ public void setValueMode(String valueMode) { assertArgumentNotNull("Value Mode", valueMode); this.valueMode = ValueMode.valueOf(ValueMode.class, valueMode.toUpperCase()); } /** * @return this configuration instance * @see #setValueMode(String) */ public TerracottaConfiguration valueMode(String valueMode) { setValueMode(valueMode); return this; } /** * @return this configuration instance * @see #setValueMode(String) */ public TerracottaConfiguration valueMode(ValueMode valueMode) { if (valueMode == null) { throw new IllegalArgumentException("Value mode must be non-null"); } this.valueMode = valueMode; return this; } /** * Get the value mode in terms of the mode enum */ public ValueMode getValueMode() { return this.valueMode; } /** * Sets whether this cache should perform orphan eviction (usually should be {@value #DEFAULT_ORPHAN_EVICTION}). *

* Orphans are elements that are not present on any node in the cluster anymore and hence need additional routines to be detected since * they're not locally available anywhere. *

* Defaults to {@value #DEFAULT_ORPHAN_EVICTION}. * * @param orphanEviction * {@code true} if orphan eviction should be used; {@code false} otherwise */ public void setOrphanEviction(boolean orphanEviction) { this.orphanEviction = orphanEviction; } /** * @return this configuration instance * @see #setOrphanEviction(boolean) */ public TerracottaConfiguration orphanEviction(boolean orphanEviction) { setOrphanEviction(orphanEviction); return this; } /** * Check whether orphan eviction is enabled */ public boolean getOrphanEviction() { return this.orphanEviction; } /** * Set how often this cache should perform orphan eviction (measured in regular eviction periods). *

* Defaults to {@value #DEFAULT_ORPHAN_EVICTION_PERIOD}). * * @param orphanEvictionPeriod * every how many regular evictions an orphan eviction should occur */ public void setOrphanEvictionPeriod(int orphanEvictionPeriod) { this.orphanEvictionPeriod = orphanEvictionPeriod; } /** * @return this configuration instance * @see #setOrphanEvictionPeriod(int) */ public TerracottaConfiguration orphanEvictionPeriod(int orphanEvictionPeriod) { setOrphanEvictionPeriod(orphanEvictionPeriod); return this; } /** * Get the number of regular eviction cycles between orphan evictions */ public int getOrphanEvictionPeriod() { return this.orphanEvictionPeriod; } /** * Sets whether this cache should use an unclustered local key cache (usually should be {@value #DEFAULT_LOCAL_KEY_CACHE} unless * optimizing for a small read-only cache) *

* Defaults to {@value #DEFAULT_LOCAL_KEY_CACHE}. * * @param localKeyCache * {@code true} if a local key cache should be used; {@code false} otherwise */ public void setLocalKeyCache(boolean localKeyCache) { this.localKeyCache = localKeyCache; } /** * @return this configuration instance * @see #setLocalKeyCache(boolean) */ public TerracottaConfiguration localKeyCache(boolean localKeyCache) { setLocalKeyCache(localKeyCache); return this; } /** * Check whether the local key cache is enabled */ public boolean getLocalKeyCache() { return this.localKeyCache; } /** * Sets maximum size of the local key cache (usually the size of the key set of the cache or cache partition). *

* Defaults to {@value #DEFAULT_LOCAL_KEY_CACHE_SIZE}. * * @param localKeyCacheSize * the size of the local key cache in number of keys */ public void setLocalKeyCacheSize(int localKeyCacheSize) { this.localKeyCacheSize = localKeyCacheSize; } /** * @return this configuration instance * @see #setLocalKeyCacheSize(int) */ public TerracottaConfiguration localKeyCacheSize(int localKeyCacheSize) { setLocalKeyCacheSize(localKeyCacheSize); return this; } /** * Get the size limit of the local key cache (if enabled) */ public int getLocalKeyCacheSize() { return this.localKeyCacheSize; } /** * Used by BeanHandler to set the coherent during parsing * * @deprecated since 2.4 Use {@link #setConsistency(Consistency)} instead */ @Deprecated public void setCoherent(boolean coherent) { Consistency consistencyType = coherent ? Consistency.STRONG : Consistency.EVENTUAL; this.consistency(consistencyType); } /** * @return this configuration instance * @deprecated since 2.4 Use {@link #consistency(Consistency)} instead */ @Deprecated public TerracottaConfiguration coherent(boolean coherent) { Consistency consistencyType = coherent ? Consistency.STRONG : Consistency.EVENTUAL; this.consistency(consistencyType); return this; } /** * Is the cache configured for coherent or incoherent mode. * * @return true if configured in coherent mode. * @deprecated since 2.4 Use {@link #getConsistency()} instead to query the {@link Consistency} or Ehcache#isNodeCoherent() * to query if the node is coherent */ @Deprecated public boolean isCoherent() { return consistency == Consistency.STRONG; } /** * Is the cache configured for synchronous-write? * * @return true if configured for synchronouse-write, otherwise false. Default is false */ public boolean isSynchronousWrites() { return synchronousWrites; } /** * Set the value for synchronous-write * * @param synchronousWrites * true for using synchronous-write */ public void setSynchronousWrites(boolean synchronousWrites) { this.synchronousWrites = synchronousWrites; } /** * @return this configuration instance * @see #setSynchronousWrites(boolean) */ public TerracottaConfiguration synchronousWrites(boolean synchronousWrites) { setSynchronousWrites(synchronousWrites); return this; } /** * @return this configuration instance * @see #setConcurrency(int) */ public TerracottaConfiguration concurrency(final int concurrency) { setConcurrency(concurrency); return this; } /** * Sets the value of concurrency. Throws {@link IllegalArgumentException} if the value is less than 0. * This value cannot be changed once cache is initialized. */ public void setConcurrency(final int concurrency) { if (concurrency < 0) { throw new IllegalArgumentException("Only non-negative integers allowed"); } this.concurrency = concurrency; } /** * Get the value of concurrency. * This value cannot be changed once cache is initialized. */ public int getConcurrency() { return this.concurrency; } /** * Add the {@link NonstopConfiguration} * * @param nonstopConfiguration */ public void addNonstop(NonstopConfiguration nonstopConfiguration) { this.nonStopConfiguration = nonstopConfiguration; } /** * Set the {@link NonstopConfiguration} * * @param nonstopConfiguration * @return this configuration instance */ public TerracottaConfiguration nonstop(NonstopConfiguration nonstopConfiguration) { this.addNonstop(nonstopConfiguration); return this; } /** * Get the {@link NonstopConfiguration}, may be null * * @return the {@link NonstopConfiguration}, may be null */ public NonstopConfiguration getNonstopConfiguration() { return nonStopConfiguration; } /** * Returns true if nonstop is enabled * * @return true if nonstop is enabled */ public boolean isNonstopEnabled() { return nonStopConfiguration != null && nonStopConfiguration.isEnabled(); } /** * Setter for consistency, returns this instance * * @param consistency * @return this instance */ public TerracottaConfiguration consistency(Consistency consistency) { setConsistency(consistency); return this; } /** * Setter for consistency * * @param consistency */ public void setConsistency(Consistency consistency) { this.consistency = consistency; } /** * Setter for consistency * * @param consistency */ public void setConsistency(String consistency) { if (consistency == null) { throw new IllegalArgumentException("Consistency cannot be null"); } this.setConsistency(Consistency.valueOf(consistency.toUpperCase())); } /** * Getter for consistency * * @return the consistency */ public Consistency getConsistency() { return this.consistency; } /** * Returns true if local cache is enabled, otherwise false * @return true if local cache is enabled, otherwise false */ public boolean isLocalCacheEnabled() { return localCacheEnabled; } /** * Enable or disable the local cache * @param localCacheEnabled */ public void setLocalCacheEnabled(final boolean localCacheEnabled) { this.localCacheEnabled = localCacheEnabled; } /** * Enable or disable the local cache * @param localCacheEnabled * @return this instance */ public TerracottaConfiguration localCacheEnabled(final boolean localCacheEnabled) { setLocalCacheEnabled(localCacheEnabled); return this; } /** * Enum for various consistency settings * * @author Abhishek Sanoujam * */ public static enum Consistency { /** * Strong consistency */ STRONG, /** * Eventual consistency */ EVENTUAL; } /* * It is important that each instance of TerracottaConfiguration gets it's own, initial, default * NonstopConfiguration. Otherwise, getNonstopConfiguration().blah(...) calls can change the * default instance, leading to weirdness in writing out the xml and other places. */ private static NonstopConfiguration makeDefaultNonstopConfiguration() { return new NonstopConfiguration().enabled(false); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy