/*
* JBoss, Home of Professional Open Source.
* Copyright 2000 - 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.cache.config;
import org.jboss.cache.Version;
import org.jboss.cache.buddyreplication.BuddyManager;
import org.jboss.cache.config.parsing.JGroupsStackParser;
import org.jboss.cache.factories.annotations.NonVolatile;
import org.jboss.cache.factories.annotations.Start;
import org.jboss.cache.lock.IsolationLevel;
import org.jboss.cache.marshall.Marshaller;
import org.w3c.dom.Element;
import java.net.URL;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
/**
* Encapsulates the configuration of a Cache.
*
* @author Manik Surtani (manik AT jboss DOT org)
*/
@NonVolatile
public class Configuration extends ConfigurationComponent
{
private static final long serialVersionUID = 5553791890144997466L;
private transient JGroupsStackParser jGroupsStackParser = new JGroupsStackParser();
/**
* Behavior of the JVM shutdown hook registered by the cache
*/
public static enum ShutdownHookBehavior
{
/**
* By default a shutdown hook is registered if no MBean server (apart from the JDK default) is detected.
*/
DEFAULT,
/**
* Forces the cache to register a shutdown hook even if an MBean server is detected.
*/
REGISTER,
/**
* Forces the cache NOT to register a shutdown hook, even if no MBean server is detected.
*/
DONT_REGISTER
}
/**
* Cache replication mode.
*/
public static enum CacheMode
{
/**
* Data is not replicated.
*/
LOCAL,
/**
* Data replicated synchronously.
*/
REPL_SYNC,
/**
* Data replicated asynchronously.
*/
REPL_ASYNC,
/**
* Data invalidated synchronously.
*/
INVALIDATION_SYNC,
/**
* Data invalidated asynchronously.
*/
INVALIDATION_ASYNC;
/**
* Returns true if the mode is invalidation, either sync or async.
*/
public boolean isInvalidation()
{
return this == INVALIDATION_SYNC || this == INVALIDATION_ASYNC;
}
public boolean isSynchronous()
{
return this == REPL_SYNC || this == INVALIDATION_SYNC || this == LOCAL;
}
}
public static CacheMode legacyModeToCacheMode(int legacyMode)
{
switch (legacyMode)
{
case 1:
return CacheMode.LOCAL;
case 2:
return CacheMode.REPL_ASYNC;
case 3:
return CacheMode.REPL_SYNC;
case 4:
return CacheMode.INVALIDATION_ASYNC;
case 5:
return CacheMode.INVALIDATION_SYNC;
default:
throw new IllegalArgumentException("Unknown legacy cache mode " +
legacyMode);
}
}
/**
* Cache node locking scheme.
*/
public static enum NodeLockingScheme
{
/**
* Data is locked using the MVCC locking scheme. This is the default locking scheme in JBoss Cache 3.0.0.
*
* @see http://wiki.jboss.org/wiki/JBossCacheMVCC
*/
MVCC,
/**
* Data is exclusively locked during modification.
*
* @see http://en.wikipedia.org/wiki/Concurrency_control (pessimistic)
*/
PESSIMISTIC,
/**
* Data is unlocked during modification, modifications merged at commit.
*
* @see http://en.wikipedia.org/wiki/Optimistic_concurrency_control
*/
OPTIMISTIC;
/**
* @return true if the node locking scheme uses versioning.
*/
public boolean isVersionedScheme()
{
return this == OPTIMISTIC;
}
}
/**
* Default replication version, from {@link Version#getVersionShort}.
*/
public static final short DEFAULT_REPLICATION_VERSION = Version.getVersionShort();
// ------------------------------------------------------------------------------------------------------------
// CONFIGURATION OPTIONS
// ------------------------------------------------------------------------------------------------------------
private String clusterName = "JBossCache-Cluster";
private String clusterConfig = null;
private boolean useReplQueue = false;
@Dynamic
private int replQueueMaxElements = 1000;
@Dynamic
private long replQueueInterval = 5000;
private boolean exposeManagementStatistics = true;
@Dynamic
private boolean fetchInMemoryState = true;
private boolean nonBlockingStateTransfer = false;
private short replicationVersion = DEFAULT_REPLICATION_VERSION;
@Dynamic
private long lockAcquisitionTimeout = 10000;
@Dynamic
private long syncReplTimeout = 15000;
private CacheMode cacheMode = CacheMode.LOCAL;
private boolean inactiveOnStartup = false;
@Dynamic
private long stateRetrievalTimeout = 10000;
private IsolationLevel isolationLevel = IsolationLevel.REPEATABLE_READ;
@Dynamic
private boolean lockParentForChildInsertRemove = false;
@Dynamic
private EvictionConfig evictionConfig = null;
private boolean useRegionBasedMarshalling = false;
private String transactionManagerLookupClass = null;
private CacheLoaderConfig cacheLoaderConfig = null;
@Dynamic
private boolean syncCommitPhase = false;
@Dynamic
private boolean syncRollbackPhase = false;
private BuddyReplicationConfig buddyReplicationConfig;
@Deprecated
private NodeLockingScheme nodeLockingScheme = NodeLockingScheme.MVCC;
private String muxStackName = null;
private boolean usingMultiplexer = false;
private transient RuntimeConfig runtimeConfig;
private String marshallerClass;
private ShutdownHookBehavior shutdownHookBehavior = ShutdownHookBehavior.DEFAULT;
private boolean useLazyDeserialization = false;
private int objectInputStreamPoolSize = 50;
private int objectOutputStreamPoolSize = 50;
private List customInterceptors = Collections.emptyList();
private boolean writeSkewCheck = false;
private int concurrencyLevel = 500;
private int listenerAsyncPoolSize = 1;
private int listenerAsyncQueueSize = 50000;
private int serializationExecutorPoolSize = 0;
private int serializationExecutorQueueSize = 50000;
private Marshaller marshaller;
private boolean invocationBatchingEnabled;
private boolean useLockStriping = true;
private URL jgroupsConfigFile;
@Start(priority = 1)
void correctIsolationLevels()
{
// ensure the correct isolation level upgrades and/or downgrades are performed.
if (nodeLockingScheme == NodeLockingScheme.MVCC)
{
switch (isolationLevel)
{
case NONE:
case READ_UNCOMMITTED:
isolationLevel = IsolationLevel.READ_COMMITTED;
break;
case SERIALIZABLE:
isolationLevel = IsolationLevel.REPEATABLE_READ;
break;
}
}
}
// ------------------------------------------------------------------------------------------------------------
// SETTERS - MAKE SURE ALL SETTERS PERFORM testImmutability()!!!
// ------------------------------------------------------------------------------------------------------------
public void setCacheMarshaller(Marshaller instance)
{
marshaller = instance;
}
public Marshaller getMarshaller()
{
return marshaller;
}
public boolean isWriteSkewCheck()
{
return writeSkewCheck;
}
public boolean isUseLockStriping()
{
return useLockStriping;
}
public void setWriteSkewCheck(boolean writeSkewCheck)
{
testImmutability("writeSkewCheck");
this.writeSkewCheck = writeSkewCheck;
}
public void setUseLockStriping(boolean useLockStriping)
{
testImmutability("useLockStriping");
this.useLockStriping = useLockStriping;
}
public int getConcurrencyLevel()
{
return concurrencyLevel;
}
public void setConcurrencyLevel(int concurrencyLevel)
{
testImmutability("concurrencyLevel");
this.concurrencyLevel = concurrencyLevel;
}
/**
* Converts a list of elements to a Java Groups property string.
*/
public void setClusterConfig(Element config)
{
setClusterConfig(jGroupsStackParser.parseClusterConfigXml(config));
}
public void setClusterName(String clusterName)
{
testImmutability("clusterName");
this.clusterName = clusterName;
}
public void setClusterConfig(String clusterConfig)
{
testImmutability("clusterConfig");
this.clusterConfig = clusterConfig;
}
public void setReplQueueMaxElements(int replQueueMaxElements)
{
testImmutability("replQueueMaxElements");
this.replQueueMaxElements = replQueueMaxElements;
}
public void setReplQueueInterval(long replQueueInterval)
{
testImmutability("replQueueInterval");
this.replQueueInterval = replQueueInterval;
}
public void setExposeManagementStatistics(boolean useMbean)
{
testImmutability("exposeManagementStatistics");
this.exposeManagementStatistics = useMbean;
}
/**
* Enables invocation batching if set to true. You still need to use {@link org.jboss.cache.Cache#startBatch()}
* and {@link org.jboss.cache.Cache#endBatch(boolean)} to demarcate the start and end of batches.
*
* @param enabled if true, batching is enabled.
* @since 3.0
*/
public void setInvocationBatchingEnabled(boolean enabled)
{
testImmutability("invocationBatchingEnabled");
this.invocationBatchingEnabled = enabled;
}
public void setFetchInMemoryState(boolean fetchInMemoryState)
{
testImmutability("fetchInMemoryState");
this.fetchInMemoryState = fetchInMemoryState;
}
public void setReplicationVersion(short replicationVersion)
{
testImmutability("replicationVersion");
this.replicationVersion = replicationVersion;
}
public void setReplVersionString(String replVersionString)
{
setReplicationVersion(replVersionString == null ? 0 : Version.getVersionShort(replVersionString));
}
public void setLockAcquisitionTimeout(long lockAcquisitionTimeout)
{
testImmutability("lockAcquisitionTimeout");
this.lockAcquisitionTimeout = lockAcquisitionTimeout;
}
public void setSyncReplTimeout(long syncReplTimeout)
{
testImmutability("syncReplTimeout");
this.syncReplTimeout = syncReplTimeout;
}
public void setCacheMode(CacheMode cacheModeInt)
{
testImmutability("cacheMode");
this.cacheMode = cacheModeInt;
}
public void setCacheMode(String cacheMode)
{
testImmutability("cacheMode");
if (cacheMode == null) throw new ConfigurationException("Cache mode cannot be null", "CacheMode");
this.cacheMode = CacheMode.valueOf(uc(cacheMode));
if (this.cacheMode == null)
{
log.warn("Unknown cache mode '" + cacheMode + "', using defaults.");
this.cacheMode = CacheMode.LOCAL;
}
}
public String getCacheModeString()
{
return cacheMode == null ? null : cacheMode.toString();
}
public void setCacheModeString(String cacheMode)
{
setCacheMode(cacheMode);
}
public void setInactiveOnStartup(boolean inactiveOnStartup)
{
testImmutability("inactiveOnStartup");
this.inactiveOnStartup = inactiveOnStartup;
}
public EvictionConfig getEvictionConfig()
{
return evictionConfig;
}
public void setEvictionConfig(EvictionConfig config)
{
testImmutability("evictionConfig");
this.evictionConfig = config;
}
/**
* This is a deprecated configuration option. While it will be supported for the 2.x series for backward compatibility,
* expect to see it disappear in 3.x.
*
* With {@link #isUseLazyDeserialization()}, which is enabled by default, custom class loaders are handled implicitly.
* See the user guide for details on how this is handled.
*
*/
public void setUseRegionBasedMarshalling(boolean useRegionBasedMarshalling)
{
testImmutability("useRegionBasedMarshalling");
this.useRegionBasedMarshalling = useRegionBasedMarshalling;
}
public void setTransactionManagerLookupClass(String transactionManagerLookupClass)
{
testImmutability("transactionManagerLookupClass");
this.transactionManagerLookupClass = transactionManagerLookupClass;
}
public void setCacheLoaderConfig(CacheLoaderConfig config)
{
testImmutability("cacheLoaderConfig");
replaceChildConfig(this.cacheLoaderConfig, config);
this.cacheLoaderConfig = config;
}
public void setSyncCommitPhase(boolean syncCommitPhase)
{
testImmutability("syncCommitPhase");
this.syncCommitPhase = syncCommitPhase;
}
public void setSyncRollbackPhase(boolean syncRollbackPhase)
{
testImmutability("syncRollbackPhase");
this.syncRollbackPhase = syncRollbackPhase;
}
/**
* Sets the size of the asynchronous listener notification thread pool size. Defaults to 1, and if set to below 1,
* all async listeners (specified with {@link org.jboss.cache.notifications.annotation.CacheListener#sync()} are notified
* synchronously.
*
* @param listenerAsyncPoolSize number of threads in pool
* @since 3.0
*/
public void setListenerAsyncPoolSize(int listenerAsyncPoolSize)
{
testImmutability("listenerAsyncPoolSize");
this.listenerAsyncPoolSize = listenerAsyncPoolSize;
}
/**
* Sets the queue size of the bounded queue used to store async listener events on. This defaults to 50,000.
*
* @param listenerAsyncQueueSize queue size to use
*/
public void setListenerAsyncQueueSize(int listenerAsyncQueueSize)
{
testImmutability("listenerAsyncQueueSize");
this.listenerAsyncQueueSize = listenerAsyncQueueSize;
}
/**
* Sets the queue size of the bounded queue used to store async serialization events on. This defaults to 50,000.
*
* @param serializationExecutorQueueSize queue size to use
*/
public void setSerializationExecutorQueueSize(int serializationExecutorQueueSize)
{
testImmutability("serializationExecutorQueueSize");
this.serializationExecutorQueueSize = serializationExecutorQueueSize;
}
public void setBuddyReplicationConfig(BuddyReplicationConfig config)
{
testImmutability("buddyReplicationConfig");
replaceChildConfig(this.buddyReplicationConfig, config);
this.buddyReplicationConfig = config;
}
/**
* @deprecated will default to MVCC once optimistic and pessimistic schemes are removed.
* @param nodeLockingScheme
*/
@Deprecated
public void setNodeLockingScheme(NodeLockingScheme nodeLockingScheme)
{
testImmutability("nodeLockingScheme");
testImmutability("nodeLockingOptimistic");
this.nodeLockingScheme = nodeLockingScheme;
}
public void setUseReplQueue(boolean useReplQueue)
{
testImmutability("useReplQueue");
this.useReplQueue = useReplQueue;
}
public void setIsolationLevel(IsolationLevel isolationLevel)
{
testImmutability("isolationLevel");
this.isolationLevel = isolationLevel;
}
/**
* Starting with 3.x there are 3 locking schemes, so if true is passed in then state is not defined.
* It is here for backward compatibility reasons only and should not be used by new code.
*/
@Deprecated
public void setNodeLockingOptimistic(boolean nodeLockingOptimistic)
{
testImmutability("nodeLockingOptimistic");
if (nodeLockingOptimistic) setNodeLockingScheme(NodeLockingScheme.OPTIMISTIC);
else setNodeLockingScheme(NodeLockingScheme.PESSIMISTIC);
}
public void setStateRetrievalTimeout(long stateRetrievalTimeout)
{
testImmutability("stateRetrievalTimeout");
this.stateRetrievalTimeout = stateRetrievalTimeout;
}
public void setNodeLockingScheme(String nodeLockingScheme)
{
testImmutability("nodeLockingScheme");
if (nodeLockingScheme == null)
{
throw new ConfigurationException("Node locking scheme cannot be null", "NodeLockingScheme");
}
this.nodeLockingScheme = NodeLockingScheme.valueOf(uc(nodeLockingScheme));
if (this.nodeLockingScheme == null)
{
log.warn("Unknown node locking scheme '" + nodeLockingScheme + "', using defaults.");
this.nodeLockingScheme = NodeLockingScheme.PESSIMISTIC;
}
}
@Deprecated
public String getNodeLockingSchemeString()
{
return nodeLockingScheme == null ? null : nodeLockingScheme.toString();
}
public void setNodeLockingSchemeString(String nodeLockingScheme)
{
setNodeLockingScheme(nodeLockingScheme);
}
private static String uc(String s)
{
return s.toUpperCase(Locale.ENGLISH);
}
public void setIsolationLevel(String isolationLevel)
{
testImmutability("isolationLevel");
if (isolationLevel == null) throw new ConfigurationException("Isolation level cannot be null", "IsolationLevel");
this.isolationLevel = IsolationLevel.valueOf(uc(isolationLevel));
if (this.isolationLevel == null)
{
log.warn("Unknown isolation level '" + isolationLevel + "', using defaults.");
this.isolationLevel = IsolationLevel.REPEATABLE_READ;
}
}
public String getIsolationLevelString()
{
return isolationLevel == null ? null : isolationLevel.toString();
}
public void setIsolationLevelString(String isolationLevel)
{
setIsolationLevel(isolationLevel);
}
/**
* Sets whether inserting or removing a node requires a write lock
* on the node's parent (when pessimistic locking is used.)
*
* The default value is false
*/
public void setLockParentForChildInsertRemove(boolean lockParentForChildInsertRemove)
{
testImmutability("lockParentForChildInsertRemove");
this.lockParentForChildInsertRemove = lockParentForChildInsertRemove;
}
public void setMultiplexerStack(String stackName)
{
testImmutability("muxStackName");
this.muxStackName = stackName;
}
public boolean isUsingMultiplexer()
{
return usingMultiplexer;
}
public void setUsingMultiplexer(boolean usingMultiplexer)
{
testImmutability("usingMultiplexer");
this.usingMultiplexer = usingMultiplexer;
}
public void setShutdownHookBehavior(ShutdownHookBehavior shutdownHookBehavior)
{
testImmutability("shutdownHookBehavior");
this.shutdownHookBehavior = shutdownHookBehavior;
}
public void setShutdownHookBehavior(String shutdownHookBehavior)
{
testImmutability("shutdownHookBehavior");
if (shutdownHookBehavior == null)
throw new ConfigurationException("Shutdown hook behavior cannot be null", "ShutdownHookBehavior");
this.shutdownHookBehavior = ShutdownHookBehavior.valueOf(uc(shutdownHookBehavior));
if (this.shutdownHookBehavior == null)
{
log.warn("Unknown shutdown hook behavior '" + shutdownHookBehavior + "', using defaults.");
this.shutdownHookBehavior = ShutdownHookBehavior.DEFAULT;
}
}
public void setUseLazyDeserialization(boolean useLazyDeserialization)
{
testImmutability("useLazyDeserialization");
this.useLazyDeserialization = useLazyDeserialization;
}
/**
* Initialises the size of the object input stream pool size, which defaults to 50.
*
* @param objectInputStreamPoolSize
* @since 2.1.0
*/
public void setObjectInputStreamPoolSize(int objectInputStreamPoolSize)
{
testImmutability("objectInputStreamPoolSize");
this.objectInputStreamPoolSize = objectInputStreamPoolSize;
}
/**
* Initialises the size of the object output stream pool size, which defaults to 50.
*
* @param objectOutputStreamPoolSize
* @since 2.1.0
*/
public void setObjectOutputStreamPoolSize(int objectOutputStreamPoolSize)
{
testImmutability("objectOutputStreamPoolSize");
this.objectOutputStreamPoolSize = objectOutputStreamPoolSize;
}
/**
* Sets the async replication serialization executor pool size for async replication. Has no effect if the
* replication queue is used.
*
* @param serializationExecutorPoolSize number of threads to use
*/
public void setSerializationExecutorPoolSize(int serializationExecutorPoolSize)
{
testImmutability("serializationExecutorPoolSize");
this.serializationExecutorPoolSize = serializationExecutorPoolSize;
}
// ------------------------------------------------------------------------------------------------------------
// GETTERS
// ------------------------------------------------------------------------------------------------------------
public ShutdownHookBehavior getShutdownHookBehavior()
{
return this.shutdownHookBehavior;
}
/**
* This helper method is deprecated and will be removed when optimistic and pessimistic locking support is dropped.
*
* @return true if node locking scheme is optimistic.
* @deprecated use {@link #getNodeLockingScheme()} to determine node locking scheme used.
*/
@Deprecated
public boolean isNodeLockingOptimistic()
{
return nodeLockingScheme == NodeLockingScheme.OPTIMISTIC;
}
public boolean isUseReplQueue()
{
return useReplQueue;
}
public String getClusterName()
{
return clusterName;
}
public String getClusterConfig()
{
return clusterConfig;
}
public int getReplQueueMaxElements()
{
return replQueueMaxElements;
}
public long getReplQueueInterval()
{
return replQueueInterval;
}
/**
* @deprecated use isExposeManagementStatistics()
*/
@Deprecated
public boolean getExposeManagementStatistics()
{
return exposeManagementStatistics;
}
public boolean isExposeManagementStatistics()
{
return exposeManagementStatistics;
}
/**
* @return true if invocation batching is enabled.
* @since 3.0
*/
public boolean isInvocationBatchingEnabled()
{
return invocationBatchingEnabled;
}
public boolean isFetchInMemoryState()
{
return fetchInMemoryState;
}
public short getReplicationVersion()
{
return replicationVersion;
}
public String getReplVersionString()
{
return Version.getVersionString(replicationVersion);
}
public long getLockAcquisitionTimeout()
{
return lockAcquisitionTimeout;
}
public long getSyncReplTimeout()
{
return syncReplTimeout;
}
public CacheMode getCacheMode()
{
return cacheMode;
}
public boolean isInactiveOnStartup()
{
return inactiveOnStartup;
}
public IsolationLevel getIsolationLevel()
{
return isolationLevel;
}
/**
* Gets whether inserting or removing a node requires a write lock
* on the node's parent (when pessimistic locking is used.)
*
* The default value is false
*/
public boolean isLockParentForChildInsertRemove()
{
return lockParentForChildInsertRemove;
}
public boolean isUseRegionBasedMarshalling()
{
return useRegionBasedMarshalling;
}
public String getTransactionManagerLookupClass()
{
return transactionManagerLookupClass;
}
public CacheLoaderConfig getCacheLoaderConfig()
{
return cacheLoaderConfig;
}
public boolean isSyncCommitPhase()
{
return syncCommitPhase;
}
public boolean isSyncRollbackPhase()
{
return syncRollbackPhase;
}
/**
* Gets the size of the asynchronous listener notification thread pool size. Defaults to 1, and if set to below 1,
* all async listeners (specified with {@link org.jboss.cache.notifications.annotation.CacheListener#sync()} are notified
* synchronously.
*
* @return thread pool size
* @since 3.0
*/
public int getListenerAsyncPoolSize()
{
return listenerAsyncPoolSize;
}
public BuddyReplicationConfig getBuddyReplicationConfig()
{
return buddyReplicationConfig;
}
/**
* @deprecated will be removed once optimistic and pessimistic locking is removed.
* @return node locking scheme in use
*/
@Deprecated
public NodeLockingScheme getNodeLockingScheme()
{
return nodeLockingScheme;
}
public long getStateRetrievalTimeout()
{
return stateRetrievalTimeout;
}
public String getMultiplexerStack()
{
return muxStackName;
}
public boolean isUseLazyDeserialization()
{
return useLazyDeserialization;
}
public synchronized RuntimeConfig getRuntimeConfig()
{
if (runtimeConfig == null)
{
setRuntimeConfig(new RuntimeConfig(), false);
}
return runtimeConfig;
}
public void setRuntimeConfig(RuntimeConfig runtimeConfig)
{
setRuntimeConfig(runtimeConfig, true);
}
private void setRuntimeConfig(RuntimeConfig runtimeConfig, boolean testImmutability)
{
if (testImmutability)
{
testImmutability("runtimeConfig");
}
this.runtimeConfig = runtimeConfig;
}
public String getMarshallerClass()
{
return marshallerClass;
}
public void setMarshallerClass(String marshallerClass)
{
this.marshallerClass = marshallerClass;
}
/**
* @return the size of he object input stream pool
* @since 2.1.0
*/
public int getObjectInputStreamPoolSize()
{
return objectInputStreamPoolSize;
}
/**
* @return the size of he object output stream pool
* @since 2.1.0
*/
public int getObjectOutputStreamPoolSize()
{
return objectOutputStreamPoolSize;
}
/**
* Returns a {@link java.net.URL} to a default JGroups configuration file.
*
* @return a default JGroups config file
*/
public URL getDefaultClusterConfig()
{
URL url = getClass().getClassLoader().getResource("flush-udp.xml");
if (log.isTraceEnabled()) log.trace("Using default JGroups configuration file " + url);
return url;
}
public URL getJGroupsConfigFile()
{
return jgroupsConfigFile;
}
public void setJgroupsConfigFile(URL jgroupsConfigFile)
{
this.jgroupsConfigFile = jgroupsConfigFile;
}
/**
* @return the serialization executor pool size.
*/
public int getSerializationExecutorPoolSize()
{
return serializationExecutorPoolSize;
}
/**
*
* @return the bounded queue size for async listeners
*/
public int getListenerAsyncQueueSize()
{
return listenerAsyncQueueSize;
}
/**
*
* @return the bounded queue size for async serializers
*/
public int getSerializationExecutorQueueSize()
{
return serializationExecutorQueueSize;
}
// ------------------------------------------------------------------------------------------------------------
// HELPERS
// ------------------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------------------
// OVERRIDDEN METHODS
// ------------------------------------------------------------------------------------------------------------
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Configuration that = (Configuration) o;
if (exposeManagementStatistics != that.exposeManagementStatistics) return false;
if (fetchInMemoryState != that.fetchInMemoryState) return false;
if (inactiveOnStartup != that.inactiveOnStartup) return false;
if (lockAcquisitionTimeout != that.lockAcquisitionTimeout) return false;
if (lockParentForChildInsertRemove != that.lockParentForChildInsertRemove) return false;
if (objectInputStreamPoolSize != that.objectInputStreamPoolSize) return false;
if (objectOutputStreamPoolSize != that.objectOutputStreamPoolSize) return false;
if (replQueueInterval != that.replQueueInterval) return false;
if (replQueueMaxElements != that.replQueueMaxElements) return false;
if (replicationVersion != that.replicationVersion) return false;
if (stateRetrievalTimeout != that.stateRetrievalTimeout) return false;
if (syncCommitPhase != that.syncCommitPhase) return false;
if (syncReplTimeout != that.syncReplTimeout) return false;
if (syncRollbackPhase != that.syncRollbackPhase) return false;
if (useLazyDeserialization != that.useLazyDeserialization) return false;
if (useRegionBasedMarshalling != that.useRegionBasedMarshalling) return false;
if (useReplQueue != that.useReplQueue) return false;
if (usingMultiplexer != that.usingMultiplexer) return false;
if (buddyReplicationConfig != null ? !buddyReplicationConfig.equals(that.buddyReplicationConfig) : that.buddyReplicationConfig != null)
return false;
if (cacheLoaderConfig != null ? !cacheLoaderConfig.equals(that.cacheLoaderConfig) : that.cacheLoaderConfig != null)
return false;
if (cacheMode != that.cacheMode) return false;
if (clusterConfig != null ? !clusterConfig.equals(that.clusterConfig) : that.clusterConfig != null) return false;
if (clusterName != null ? !clusterName.equals(that.clusterName) : that.clusterName != null) return false;
if (evictionConfig != null ? !evictionConfig.equals(that.evictionConfig) : that.evictionConfig != null)
return false;
if (isolationLevel != that.isolationLevel) return false;
if (marshaller != null ? !marshaller.equals(that.marshaller) : that.marshaller != null) return false;
if (marshallerClass != null ? !marshallerClass.equals(that.marshallerClass) : that.marshallerClass != null)
return false;
if (muxStackName != null ? !muxStackName.equals(that.muxStackName) : that.muxStackName != null) return false;
if (nodeLockingScheme != that.nodeLockingScheme) return false;
if (runtimeConfig != null ? !runtimeConfig.equals(that.runtimeConfig) : that.runtimeConfig != null) return false;
if (shutdownHookBehavior != that.shutdownHookBehavior) return false;
if (transactionManagerLookupClass != null ? !transactionManagerLookupClass.equals(that.transactionManagerLookupClass) : that.transactionManagerLookupClass != null)
return false;
if (listenerAsyncPoolSize != that.listenerAsyncPoolSize) return false;
if (serializationExecutorPoolSize != that.serializationExecutorPoolSize) return false;
if (jgroupsConfigFile != that.jgroupsConfigFile) return false;
if (listenerAsyncQueueSize != that.listenerAsyncQueueSize) return false;
if (serializationExecutorQueueSize != that.serializationExecutorQueueSize) return false;
return true;
}
@Override
public int hashCode()
{
int result;
result = (marshaller != null ? marshaller.hashCode() : 0);
result = 31 * result + (clusterName != null ? clusterName.hashCode() : 0);
result = 31 * result + (clusterConfig != null ? clusterConfig.hashCode() : 0);
result = 31 * result + (useReplQueue ? 1 : 0);
result = 31 * result + replQueueMaxElements;
result = 31 * result + (int) (replQueueInterval ^ (replQueueInterval >>> 32));
result = 31 * result + (exposeManagementStatistics ? 1 : 0);
result = 31 * result + (fetchInMemoryState ? 1 : 0);
result = 31 * result + (int) replicationVersion;
result = 31 * result + (int) (lockAcquisitionTimeout ^ (lockAcquisitionTimeout >>> 32));
result = 31 * result + (int) (syncReplTimeout ^ (syncReplTimeout >>> 32));
result = 31 * result + (cacheMode != null ? cacheMode.hashCode() : 0);
result = 31 * result + (inactiveOnStartup ? 1 : 0);
result = 31 * result + (int) (stateRetrievalTimeout ^ (stateRetrievalTimeout >>> 32));
result = 31 * result + (isolationLevel != null ? isolationLevel.hashCode() : 0);
result = 31 * result + (lockParentForChildInsertRemove ? 1 : 0);
result = 31 * result + (evictionConfig != null ? evictionConfig.hashCode() : 0);
result = 31 * result + (useRegionBasedMarshalling ? 1 : 0);
result = 31 * result + (transactionManagerLookupClass != null ? transactionManagerLookupClass.hashCode() : 0);
result = 31 * result + (cacheLoaderConfig != null ? cacheLoaderConfig.hashCode() : 0);
result = 31 * result + (syncCommitPhase ? 1 : 0);
result = 31 * result + (syncRollbackPhase ? 1 : 0);
result = 31 * result + (buddyReplicationConfig != null ? buddyReplicationConfig.hashCode() : 0);
result = 31 * result + (nodeLockingScheme != null ? nodeLockingScheme.hashCode() : 0);
result = 31 * result + (muxStackName != null ? muxStackName.hashCode() : 0);
result = 31 * result + (usingMultiplexer ? 1 : 0);
result = 31 * result + (runtimeConfig != null ? runtimeConfig.hashCode() : 0);
result = 31 * result + (marshallerClass != null ? marshallerClass.hashCode() : 0);
result = 31 * result + (shutdownHookBehavior != null ? shutdownHookBehavior.hashCode() : 0);
result = 31 * result + (useLazyDeserialization ? 1 : 0);
result = 31 * result + objectInputStreamPoolSize;
result = 31 * result + objectOutputStreamPoolSize;
result = 31 * result + serializationExecutorPoolSize;
result = 31 * result + listenerAsyncPoolSize;
result = 31 * result + serializationExecutorQueueSize;
result = 31 * result + listenerAsyncQueueSize;
result = 31 * result + (jgroupsConfigFile != null ? jgroupsConfigFile.hashCode() : 0);
return result;
}
@Override
public Configuration clone() throws CloneNotSupportedException
{
Configuration c = (Configuration) super.clone();
if (buddyReplicationConfig != null)
{
c.setBuddyReplicationConfig(buddyReplicationConfig.clone());
}
if (evictionConfig != null)
{
c.setEvictionConfig(evictionConfig.clone());
}
if (cacheLoaderConfig != null)
{
c.setCacheLoaderConfig(cacheLoaderConfig.clone());
}
if (runtimeConfig != null)
{
c.setRuntimeConfig(runtimeConfig.clone());
// always make sure we reset the runtime when cloning.
c.getRuntimeConfig().reset();
}
return c;
}
public boolean isUsingCacheLoaders()
{
return getCacheLoaderConfig() != null && !getCacheLoaderConfig().getIndividualCacheLoaderConfigs().isEmpty();
}
public boolean isUsingBuddyReplication()
{
return getBuddyReplicationConfig() != null && getBuddyReplicationConfig().isEnabled() &&
getCacheMode() != Configuration.CacheMode.LOCAL;
}
public String getMuxStackName()
{
return muxStackName;
}
public void setMuxStackName(String muxStackName)
{
this.muxStackName = muxStackName;
}
/**
* Returns the {@link org.jboss.cache.config.CustomInterceptorConfig}, if any, associated with this configuration
* object. The custom interceptors will be added to the cache at startup in the sequence defined by this list.
*
* @return List of cutom interceptors, never null
*/
@SuppressWarnings("unchecked")
public List getCustomInterceptors()
{
return customInterceptors == null ? Collections.EMPTY_LIST : customInterceptors;
}
/**
* @see #getCustomInterceptors()
*/
public void setCustomInterceptors(List customInterceptors)
{
testImmutability("customInterceptors");
this.customInterceptors = customInterceptors;
}
public BuddyManager getConsistentHashing()
{
return null;
}
public boolean isNonBlockingStateTransfer()
{
return nonBlockingStateTransfer;
}
public void setNonBlockingStateTransfer(boolean nonBlockingStateTransfer)
{
testImmutability("nonBlockingStateTransfer");
this.nonBlockingStateTransfer = nonBlockingStateTransfer;
}
}