/*
* Copyright 2010-2013 the original author or authors.
*
* 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 org.springframework.data.gemfire;
import static org.springframework.data.gemfire.support.GemfireBeanFactoryLocator.newBeanFactoryLocator;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.geode.GemFireCheckedException;
import org.apache.geode.GemFireException;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheClosedException;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.DynamicRegionFactory;
import org.apache.geode.cache.GemFireCache;
import org.apache.geode.cache.TransactionListener;
import org.apache.geode.cache.TransactionWriter;
import org.apache.geode.cache.util.GatewayConflictResolver;
import org.apache.geode.distributed.DistributedMember;
import org.apache.geode.distributed.DistributedSystem;
import org.apache.geode.internal.datasource.ConfigProperty;
import org.apache.geode.internal.jndi.JNDIInvoker;
import org.apache.geode.pdx.PdxSerializable;
import org.apache.geode.pdx.PdxSerializer;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanClassLoaderAware;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.Phased;
import org.springframework.core.io.Resource;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator;
import org.springframework.data.gemfire.util.CollectionUtils;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* Spring {@link FactoryBean} used to configure a GemFire peer Cache. This class either looks up an existing, open
* {@link Cache} instance already or creates a new {@link Cache} instance.
*
* This class implements the {@link org.springframework.dao.support.PersistenceExceptionTranslator} interface,
* as auto-detected by Spring's {@link PersistenceExceptionTranslationPostProcessor}, for AOP-based translation
* of native GemFire Exceptions to Spring {@link DataAccessException}. Hence, the presence of this class
* automatically enables a {@link PersistenceExceptionTranslationPostProcessor} to translate GemFire Exceptions
* appropriately.
*
* @author Costin Leau
* @author David Turanski
* @author John Blum
* @see org.springframework.beans.factory.BeanClassLoaderAware
* @see org.springframework.beans.factory.BeanFactoryAware
* @see org.springframework.beans.factory.BeanNameAware
* @see org.springframework.beans.factory.FactoryBean
* @see org.springframework.beans.factory.InitializingBean
* @see org.springframework.beans.factory.DisposableBean
* @see org.springframework.context.Phased
* @see org.springframework.dao.support.PersistenceExceptionTranslator
* @see org.apache.geode.cache.Cache
* @see org.apache.geode.cache.CacheFactory
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.distributed.DistributedMember
* @see org.apache.geode.distributed.DistributedSystem
*/
@SuppressWarnings("unused")
public class CacheFactoryBean implements BeanClassLoaderAware, BeanFactoryAware, BeanNameAware, FactoryBean<Cache>,
InitializingBean, DisposableBean, PersistenceExceptionTranslator, Phased {
private boolean close = true;
private boolean useBeanFactoryLocator = false;
private int phase = -1;
protected final Log log = LogFactory.getLog(getClass());
private BeanFactory beanFactory;
private Boolean copyOnRead;
private Boolean enableAutoReconnect;
private Boolean pdxIgnoreUnreadFields;
private Boolean pdxPersistent;
private Boolean pdxReadSerialized;
private Boolean useClusterConfiguration;
private Cache cache;
private ClassLoader beanClassLoader;
private DynamicRegionSupport dynamicRegionSupport;
private Float criticalHeapPercentage;
private Float evictionHeapPercentage;
protected GemfireBeanFactoryLocator beanFactoryLocator;
private Integer lockLease;
private Integer lockTimeout;
private Integer messageSyncInterval;
private Integer searchTimeout;
private List<JndiDataSource> jndiDataSources;
private List<TransactionListener> transactionListeners;
// Declared with type 'Object' for backward compatibility
private Object gatewayConflictResolver;
private Object pdxSerializer;
private Properties properties;
private Resource cacheXml;
private String beanName;
private String cacheResolutionMessagePrefix;
private String pdxDiskStoreName;
private TransactionWriter transactionWriter;
/**
* @inheritDoc
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
*/
@Override
public void afterPropertiesSet() throws Exception {
initBeanFactoryLocator();
postProcessBeforeCacheInitialization(resolveProperties());
}
/* (non-Javadoc) */
private void initBeanFactoryLocator() {
if (useBeanFactoryLocator && beanFactoryLocator == null) {
beanFactoryLocator = newBeanFactoryLocator(this.beanFactory, this.beanName);
}
}
/* (non-Javadoc) */
protected void postProcessBeforeCacheInitialization(Properties gemfireProperties) {
if (GemfireUtils.isGemfireVersion8OrAbove()) {
gemfireProperties.setProperty("disable-auto-reconnect", String.valueOf(
!Boolean.TRUE.equals(getEnableAutoReconnect())));
gemfireProperties.setProperty("use-cluster-configuration", String.valueOf(
Boolean.TRUE.equals(getUseClusterConfiguration())));
}
}
/* (non-Javadoc) */
protected void setCache(Cache cache) {
this.cache = cache;
}
/* (non-Javadoc) */
@SuppressWarnings("unchecked")
protected <T extends GemFireCache> T getCache() {
return (T) cache;
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObject()
*/
@Override
public Cache getObject() throws Exception {
return (cache != null ? cache : init());
}
/* (non-Javadoc) */
Cache init() throws Exception {
ClassLoader currentThreadContextClassLoader = Thread.currentThread().getContextClassLoader();
try {
// use bean ClassLoader to load Spring configured, GemFire Declarable classes
Thread.currentThread().setContextClassLoader(beanClassLoader);
cache = postProcess(resolveCache());
DistributedSystem system = cache.getDistributedSystem();
DistributedMember member = system.getDistributedMember();
log.info(String.format("Connected to Distributed System [%1$s] as Member [%2$s]"
.concat("in Group(s) [%3$s] with Role(s) [%4$s] on Host [%5$s] having PID [%6$d]."),
system.getName(), member.getId(), member.getGroups(), member.getRoles(), member.getHost(),
member.getProcessId()));
log.info(String.format("%1$s GemFire v.%2$s Cache [%3$s].", cacheResolutionMessagePrefix,
CacheFactory.getVersion(), cache.getName()));
return cache;
}
finally {
Thread.currentThread().setContextClassLoader(currentThreadContextClassLoader);
}
}
/**
* If Dynamic Regions are enabled, create and initialize a DynamicRegionFactory before creating the Cache.
*/
private void initDynamicRegionFactory() {
if (dynamicRegionSupport != null) {
dynamicRegionSupport.initializeDynamicRegionFactory();
}
}
/**
* Resolves the GemFire Cache by first attempting to lookup and find an existing Cache instance in the VM;
* if an existing Cache could not be found, then this method proceeds in attempting to create a new Cache instance.
*
* @return the resolved GemFire Cache instance.
* @see org.apache.geode.cache.Cache
* @see #fetchCache()
* @see #createFactory(java.util.Properties)
* @see #prepareFactory(Object)
* @see #createCache(Object)
*/
protected Cache resolveCache() {
try {
cacheResolutionMessagePrefix = "Found existing";
return (Cache) fetchCache();
}
catch (CacheClosedException ex) {
cacheResolutionMessagePrefix = "Created new";
initDynamicRegionFactory();
return (Cache) createCache(prepareFactory(createFactory(resolveProperties())));
}
}
/**
* Fetches an existing GemFire Cache instance from the CacheFactory.
*
* @param <T> parameterized Class type extension of GemFireCache.
* @return the existing GemFire Cache instance if available.
* @throws org.apache.geode.cache.CacheClosedException if an existing GemFire Cache instance does not exist.
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.cache.CacheFactory#getAnyInstance()
*/
@SuppressWarnings("unchecked")
protected <T extends GemFireCache> T fetchCache() {
return (T) (cache != null ? cache : CacheFactory.getAnyInstance());
}
/**
* Resolves the GemFire System properties used to configure the GemFire Cache instance.
*
* @return a Properties object containing GemFire System properties used to configure the GemFire Cache instance.
* @see #getProperties()
*/
protected Properties resolveProperties() {
return (properties != null ? properties : (properties = new Properties()));
}
/**
* Creates an instance of GemFire factory initialized with the given GemFire System Properties
* to create an instance of a GemFire cache.
*
* @param gemfireProperties a Properties object containing GemFire System properties.
* @return an instance of a GemFire factory used to create a GemFire cache instance.
* @see java.util.Properties
* @see org.apache.geode.cache.CacheFactory
*/
protected Object createFactory(Properties gemfireProperties) {
return new CacheFactory(gemfireProperties);
}
/**
* Initializes the GemFire factory used to create the GemFire cache instance. Sets PDX options
* specified by the user.
*
* @param factory the GemFire factory used to create an instance of the GemFire cache.
* @return the initialized GemFire cache factory.
* @see #isPdxOptionsSpecified()
*/
protected Object prepareFactory(Object factory) {
return initializePdx((CacheFactory) factory);
}
/**
* Initialize the PDX settings on the {@link CacheFactory}.
*
* @param cacheFactory the GemFire {@link CacheFactory} used to configure and create a GemFire {@link Cache}.
* @see org.apache.geode.cache.CacheFactory
*/
CacheFactory initializePdx(CacheFactory cacheFactory) {
if (isPdxOptionsSpecified()) {
if (pdxSerializer != null) {
Assert.isInstanceOf(PdxSerializer.class, pdxSerializer,
String.format("[%1$s] of type [%2$s] is not a PdxSerializer", pdxSerializer,
ObjectUtils.nullSafeClassName(pdxSerializer)));
cacheFactory.setPdxSerializer((PdxSerializer) pdxSerializer);
}
if (pdxDiskStoreName != null) {
cacheFactory.setPdxDiskStore(pdxDiskStoreName);
}
if (pdxIgnoreUnreadFields != null) {
cacheFactory.setPdxIgnoreUnreadFields(pdxIgnoreUnreadFields);
}
if (pdxPersistent != null) {
cacheFactory.setPdxPersistent(pdxPersistent);
}
if (pdxReadSerialized != null) {
cacheFactory.setPdxReadSerialized(pdxReadSerialized);
}
}
return cacheFactory;
}
/**
* Determines whether the user specified PDX options.
*
* @return a boolean value indicating whether the user specified PDX options or not.
*/
protected boolean isPdxOptionsSpecified() {
return (pdxSerializer != null || pdxReadSerialized != null || pdxPersistent != null
|| pdxIgnoreUnreadFields != null || pdxDiskStoreName != null);
}
/**
* Creates a new GemFire cache instance using the provided factory.
*
* @param <T> parameterized Class type extension of GemFireCache.
* @param factory the appropriate GemFire factory used to create a cache instance.
* @return an instance of the GemFire cache.
* @see org.apache.geode.cache.GemFireCache
* @see org.apache.geode.cache.CacheFactory#create()
*/
@SuppressWarnings("unchecked")
protected <T extends GemFireCache> T createCache(Object factory) {
return (T) (cache != null ? cache : ((CacheFactory) factory).create());
}
/**
* Post processes the GemFire Cache instance by loading any cache.xml, applying settings specified in SDG XML
* configuration meta-data, and registering the appropriate Transaction Listeners, Writer and JNDI settings.
*
* @param <T> parameterized Class type extension of GemFireCache.
* @param cache the GemFire Cache instance to process.
* @return the GemFire Cache instance after processing.
* @throws IOException if the cache.xml Resource could not be loaded and applied to the Cache instance.
* @see org.apache.geode.cache.Cache#loadCacheXml(java.io.InputStream)
* @see #getCacheXml()
* @see #setHeapPercentages(org.apache.geode.cache.GemFireCache)
* @see #registerTransactionListeners(org.apache.geode.cache.GemFireCache)
* @see #registerTransactionWriter(org.apache.geode.cache.GemFireCache)
* @see #registerJndiDataSources()
*/
protected <T extends GemFireCache> T postProcess(T cache) throws IOException {
Resource localCacheXml = getCacheXml();
// load cache.xml Resource and initialize the Cache
if (localCacheXml != null) {
if (log.isDebugEnabled()) {
log.debug(String.format("initializing Cache with '%1$s'", cacheXml));
}
cache.loadCacheXml(localCacheXml.getInputStream());
}
if (this.copyOnRead != null) {
cache.setCopyOnRead(this.copyOnRead);
}
if (gatewayConflictResolver != null) {
((Cache) cache).setGatewayConflictResolver((GatewayConflictResolver) gatewayConflictResolver);
}
if (lockLease != null) {
((Cache) cache).setLockLease(lockLease);
}
if (lockTimeout != null) {
((Cache) cache).setLockTimeout(lockTimeout);
}
if (messageSyncInterval != null) {
((Cache) cache).setMessageSyncInterval(messageSyncInterval);
}
if (searchTimeout != null) {
((Cache) cache).setSearchTimeout(searchTimeout);
}
setHeapPercentages(cache);
registerTransactionListeners(cache);
registerTransactionWriter(cache);
registerJndiDataSources();
return cache;
}
/* (non-Javadoc) */
private void setHeapPercentages(GemFireCache cache) {
if (criticalHeapPercentage != null) {
Assert.isTrue(criticalHeapPercentage > 0.0 && criticalHeapPercentage <= 100.0,
String.format("'criticalHeapPercentage' (%1$s) is invalid; must be > 0.0 and <= 100.0",
criticalHeapPercentage));
cache.getResourceManager().setCriticalHeapPercentage(criticalHeapPercentage);
}
if (evictionHeapPercentage != null) {
Assert.isTrue(evictionHeapPercentage > 0.0 && evictionHeapPercentage <= 100.0,
String.format("'evictionHeapPercentage' (%1$s) is invalid; must be > 0.0 and <= 100.0",
evictionHeapPercentage));
cache.getResourceManager().setEvictionHeapPercentage(evictionHeapPercentage);
}
}
/* (non-Javadoc) */
private void registerTransactionListeners(GemFireCache cache) {
for (TransactionListener transactionListener : CollectionUtils.nullSafeCollection(transactionListeners)) {
cache.getCacheTransactionManager().addListener(transactionListener);
}
}
/* (non-Javadoc) */
private void registerTransactionWriter(GemFireCache cache) {
if (transactionWriter != null) {
cache.getCacheTransactionManager().setWriter(transactionWriter);
}
}
/* (non-Javadoc) */
private void registerJndiDataSources() {
for (JndiDataSource jndiDataSource : CollectionUtils.nullSafeCollection(jndiDataSources)) {
String typeAttributeValue = jndiDataSource.getAttributes().get("type");
JndiDataSourceType jndiDataSourceType = JndiDataSourceType.valueOfIgnoreCase(typeAttributeValue);
Assert.notNull(jndiDataSourceType, String.format(
"'jndi-binding' 'type' [%1$s] is invalid; 'type' must be one of %2$s", typeAttributeValue,
Arrays.toString(JndiDataSourceType.values())));
jndiDataSource.getAttributes().put("type", jndiDataSourceType.getName());
JNDIInvoker.mapDatasource(jndiDataSource.getAttributes(), jndiDataSource.getProps());
}
}
@Override
public void destroy() throws Exception {
if (close) {
Cache localCache = fetchCache();
if (localCache != null && !localCache.isClosed()) {
close(localCache);
}
this.cache = null;
if (beanFactoryLocator != null) {
beanFactoryLocator.destroy();
beanFactoryLocator = null;
}
}
}
/* (non-Javadoc) */
protected void close(GemFireCache cache) {
cache.close();
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#getObjectType()
*/
@Override
public Class<? extends GemFireCache> getObjectType() {
return (cache != null ? cache.getClass() : Cache.class);
}
/* (non-Javadoc) */
protected void setPhase(int phase) {
this.phase = phase;
}
/*
* (non-Javadoc)
* @see org.springframework.context.Phased#getPhase()
*/
@Override
public int getPhase() {
return phase;
}
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.FactoryBean#isSingleton()
*/
@Override
public boolean isSingleton() {
return true;
}
@Override
public DataAccessException translateExceptionIfPossible(RuntimeException e) {
if (e instanceof GemFireException) {
return GemfireCacheUtils.convertGemfireAccessException((GemFireException) e);
}
if (e instanceof IllegalArgumentException) {
DataAccessException wrapped = GemfireCacheUtils.convertQueryExceptions(e);
// ignore conversion if the generic exception is returned
if (!(wrapped instanceof GemfireSystemException)) {
return wrapped;
}
}
if (e.getCause() instanceof GemFireException) {
return GemfireCacheUtils.convertGemfireAccessException((GemFireException) e.getCause());
}
if (e.getCause() instanceof GemFireCheckedException) {
return GemfireCacheUtils.convertGemfireAccessException((GemFireCheckedException) e.getCause());
}
return null;
}
/**
* Sets a reference to the {@link ClassLoader} used to load and create bean classes in the Spring container.
*
* @param classLoader the {@link ClassLoader} used to load and create beans in the Spring container.
* @see java.lang.ClassLoader
*/
@Override
public void setBeanClassLoader(ClassLoader classLoader) {
this.beanClassLoader = classLoader;
}
/**
* Gets a reference to the {@link ClassLoader} used to load and create bean classes in the Spring container.
*
* @return the {@link ClassLoader} used to load and create beans in the Spring container.
* @see java.lang.ClassLoader
*/
public ClassLoader getBeanClassLoader() {
return beanClassLoader;
}
/**
* Sets a reference to the Spring {@link BeanFactory} containing this GemFire {@link Cache} {@link FactoryBean}.
*
* @param beanFactory a reference to the Spring {@link BeanFactory}.
* @see org.springframework.beans.factory.BeanFactory
* @see #getBeanFactory()
*/
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
/**
* Gets a reference to the Spring BeanFactory containing this GemFire {@link Cache} {@link FactoryBean}.
*
* @return a reference to the Spring {@link BeanFactory}.
* @see org.springframework.beans.factory.BeanFactory
* @see #setBeanFactory(BeanFactory)
*/
public BeanFactory getBeanFactory() {
return beanFactory;
}
/* (non-Javadoc) */
public GemfireBeanFactoryLocator getBeanFactoryLocator() {
return beanFactoryLocator;
}
/**
* Sets the Spring bean name for this GemFire {@link Cache}.
*
* @param name a String value indicating the Spring container bean name for the GemFire {@link Cache} object.
*/
@Override
public void setBeanName(String name) {
this.beanName = name;
}
/**
* Gets the Spring bean name for this GemFire {@link Cache}.
*
* @return a String value indicating the Spring container bean name for the GemFire {@link Cache} object.
*/
public String getBeanName() {
return beanName;
}
/**
* Sets the {@link Cache} configuration meta-data.
*
* @param cacheXml the cache.xml {@link Resource} used to initialize the GemFire {@link Cache}.
* @see org.springframework.core.io.Resource
*/
public void setCacheXml(Resource cacheXml) {
this.cacheXml = cacheXml;
}
/**
* Gets a reference to the GemFire native cache.xml file as a Spring {@link Resource}.
*
* @return the a reference to the GemFire native cache.xml as a Spring {@link Resource}.
* @see org.springframework.core.io.Resource
*/
public Resource getCacheXml() {
return cacheXml;
}
/* (non-Javadoc) */
private File getCacheXmlFile() {
try {
return getCacheXml().getFile();
}
catch (IOException e) {
throw new IllegalStateException(String.format("Resource (%1$s) is not resolvable as a file", e));
}
}
/* (non-Javadoc) */
private boolean isCacheXmlAvailable() {
try {
Resource localCacheXml = getCacheXml();
return (localCacheXml != null && localCacheXml.getFile().isFile());
}
catch (IOException ignore) {
return false;
}
}
/**
* Sets the cache properties.
*
* @param properties the properties to set
*/
public void setProperties(Properties properties) {
this.properties = properties;
}
/**
* Gets a reference to the GemFire System Properties.
*
* @return a reference to the GemFire System Properties.
* @see java.util.Properties
*/
public Properties getProperties() {
return properties;
}
/**
* Set whether the Cache should be closed.
*
* @param close set to false if destroy() should not close the cache
*/
public void setClose(boolean close) {
this.close = close;
}
/**
* @return close.
*/
public Boolean getClose() {
return close;
}
/**
* Set the copyOnRead attribute of the Cache.
*
* @param copyOnRead a boolean value indicating whether the object stored in the Cache is copied on gets.
*/
public void setCopyOnRead(Boolean copyOnRead) {
this.copyOnRead = copyOnRead;
}
/**
* @return the copyOnRead
*/
public Boolean getCopyOnRead() {
return copyOnRead;
}
/**
* Set the Cache's critical heap percentage attribute.
*
* @param criticalHeapPercentage floating point value indicating the critical heap percentage.
*/
public void setCriticalHeapPercentage(Float criticalHeapPercentage) {
this.criticalHeapPercentage = criticalHeapPercentage;
}
/**
* @return the criticalHeapPercentage
*/
public Float getCriticalHeapPercentage() {
return criticalHeapPercentage;
}
/**
* Sets an instance of the DynamicRegionSupport to support Dynamic Regions in this GemFire Cache.
*
* @param dynamicRegionSupport the DynamicRegionSupport class to setup Dynamic Regions in this Cache.
*/
public void setDynamicRegionSupport(DynamicRegionSupport dynamicRegionSupport) {
this.dynamicRegionSupport = dynamicRegionSupport;
}
/**
* @return the dynamicRegionSupport
*/
public DynamicRegionSupport getDynamicRegionSupport() {
return dynamicRegionSupport;
}
/**
* Controls whether auto-reconnect functionality introduced in GemFire 8 is enabled or not.
*
* @param enableAutoReconnect a boolean value to enable/disable auto-reconnect functionality.
* @since GemFire 8.0
*/
public void setEnableAutoReconnect(Boolean enableAutoReconnect) {
this.enableAutoReconnect = enableAutoReconnect;
}
/**
* Gets the value for the auto-reconnect setting.
*
* @return a boolean value indicating whether auto-reconnect was specified (non-null) and whether it was enabled
* or not.
*/
public Boolean getEnableAutoReconnect() {
return enableAutoReconnect;
}
/**
* Set the Cache's eviction heap percentage attribute.
*
* @param evictionHeapPercentage float-point value indicating the Cache's heap use percentage to trigger eviction.
*/
public void setEvictionHeapPercentage(Float evictionHeapPercentage) {
this.evictionHeapPercentage = evictionHeapPercentage;
}
/**
* @return the evictionHeapPercentage
*/
public Float getEvictionHeapPercentage() {
return evictionHeapPercentage;
}
/**
* Requires GemFire 7.0 or higher
* @param gatewayConflictResolver defined as Object in the signature for backward
* compatibility with Gemfire 6 compatibility. This must be an instance of
* {@link org.apache.geode.cache.util.GatewayConflictResolver}
*/
public void setGatewayConflictResolver(Object gatewayConflictResolver) {
this.gatewayConflictResolver = gatewayConflictResolver;
}
/**
* @return the gatewayConflictResolver
*/
public Object getGatewayConflictResolver() {
return gatewayConflictResolver;
}
/**
* @param jndiDataSources the list of configured JndiDataSources to use with this Cache.
*/
public void setJndiDataSources(List<JndiDataSource> jndiDataSources) {
this.jndiDataSources = jndiDataSources;
}
/**
* @return the list of configured JndiDataSources.
*/
public List<JndiDataSource> getJndiDataSources() {
return jndiDataSources;
}
/**
* Sets the number of seconds for implicit and explicit object lock leases to timeout.
*
* @param lockLease an integer value indicating the object lock lease timeout.
*/
public void setLockLease(Integer lockLease) {
this.lockLease = lockLease;
}
/**
* @return the lockLease
*/
public Integer getLockLease() {
return lockLease;
}
/**
* Sets the number of seconds in which the implicit object lock request will timeout.
*
* @param lockTimeout an integer value specifying the object lock request timeout.
*/
public void setLockTimeout(Integer lockTimeout) {
this.lockTimeout = lockTimeout;
}
/**
* @return the lockTimeout
*/
public Integer getLockTimeout() {
return lockTimeout;
}
/**
* Set for client subscription queue synchronization when this member acts as a server to clients
* and server redundancy is used. Sets the frequency (in seconds) at which the primary server sends messages
* to its secondary servers to remove queued events that have already been processed by the clients.
*
* @param messageSyncInterval an integer value specifying the number of seconds in which the primary server
* sends messages to secondary servers.
*/
public void setMessageSyncInterval(Integer messageSyncInterval) {
this.messageSyncInterval = messageSyncInterval;
}
/**
* @return the messageSyncInterval
*/
public Integer getMessageSyncInterval() {
return messageSyncInterval;
}
/**
* Set the disk store that is used for PDX meta data. Applicable on GemFire
* 6.6 or higher.
*
* @param pdxDiskStoreName the pdxDiskStoreName to set
*/
public void setPdxDiskStoreName(String pdxDiskStoreName) {
this.pdxDiskStoreName = pdxDiskStoreName;
}
/**
* @return the pdxDiskStoreName
*/
public String getPdxDiskStoreName() {
return pdxDiskStoreName;
}
/**
* Controls whether pdx ignores fields that were unread during
* deserialization. Applicable on GemFire 6.6 or higher.
*
* @param pdxIgnoreUnreadFields the pdxIgnoreUnreadFields to set
*/
public void setPdxIgnoreUnreadFields(Boolean pdxIgnoreUnreadFields) {
this.pdxIgnoreUnreadFields = pdxIgnoreUnreadFields;
}
/**
* @return the pdxIgnoreUnreadFields
*/
public Boolean getPdxIgnoreUnreadFields() {
return pdxIgnoreUnreadFields;
}
/**
* Controls whether type metadata for PDX objects is persisted to disk. Applicable on GemFire 6.6 or higher.
*
* @param pdxPersistent a boolean value indicating that PDX type meta-data should be persisted to disk.
*/
public void setPdxPersistent(Boolean pdxPersistent) {
this.pdxPersistent = pdxPersistent;
}
/**
* @return the pdxPersistent
*/
public Boolean getPdxPersistent() {
return pdxPersistent;
}
/**
* Sets the object preference to PdxInstance. Applicable on GemFire 6.6 or higher.
*
* @param pdxReadSerialized a boolean value indicating the PDX instance should be returned from Region.get(key)
* when available.
*/
public void setPdxReadSerialized(Boolean pdxReadSerialized) {
this.pdxReadSerialized = pdxReadSerialized;
}
/**
* @return the pdxReadSerialized
*/
public Boolean getPdxReadSerialized() {
return pdxReadSerialized;
}
/**
* Sets the {@link PdxSerializable} for this cache. Applicable on GemFire
* 6.6 or higher. The argument is of type object for compatibility with
* GemFire 6.5.
*
* @param serializer pdx serializer configured for this cache.
*/
public void setPdxSerializer(Object serializer) {
this.pdxSerializer = serializer;
}
/**
* @return the pdxSerializer
*/
public Object getPdxSerializer() {
return pdxSerializer;
}
/**
* Set the number of seconds a netSearch operation can wait for data before timing out.
*
* @param searchTimeout an integer value indicating the netSearch timeout value.
*/
public void setSearchTimeout(Integer searchTimeout) {
this.searchTimeout = searchTimeout;
}
/**
* @return the searchTimeout
*/
public Integer getSearchTimeout() {
return searchTimeout;
}
/**
* Sets the list of TransactionListeners used to configure the Cache to receive transaction events after
* the transaction is processed (committed, rolled back).
*
* @param transactionListeners the list of GemFire TransactionListeners listening for transaction events.
* @see org.apache.geode.cache.TransactionListener
*/
public void setTransactionListeners(List<TransactionListener> transactionListeners) {
this.transactionListeners = transactionListeners;
}
/**
* @return the transactionListeners
*/
public List<TransactionListener> getTransactionListeners() {
return transactionListeners;
}
/**
* Sets the TransactionWriter used to configure the Cache for handling transaction events, such as to veto
* the transaction or update an external DB before the commit.
*
* @param transactionWriter the GemFire TransactionWriter callback receiving transaction events.
* @see org.apache.geode.cache.TransactionWriter
*/
public void setTransactionWriter(TransactionWriter transactionWriter) {
this.transactionWriter = transactionWriter;
}
/**
* @return the transactionWriter
*/
public TransactionWriter getTransactionWriter() {
return transactionWriter;
}
/**
* Indicates whether a bean factory locator is enabled for this cache definition or not. The locator stores
* the enclosing bean factory reference to allow auto-wiring of Spring beans into GemFire managed classes.
* Usually disabled when the same cache is used in multiple application context/bean factories inside
* the same VM.
*
* @param usage true if the bean factory locator is to be used underneath the hood.
*/
public void setUseBeanFactoryLocator(boolean usage) {
this.useBeanFactoryLocator = usage;
}
/**
* @return useBeanFactoryLocator
*/
public boolean isUseBeanFactoryLocator() {
return useBeanFactoryLocator;
}
/**
* Sets the state of the use-shared-configuration GemFire distribution config setting.
*
* @param useSharedConfiguration a boolean value to set the use-shared-configuration GemFire distribution property.
*/
public void setUseClusterConfiguration(Boolean useSharedConfiguration) {
this.useClusterConfiguration = useSharedConfiguration;
}
/**
* Gets the value of the use-shared-configuration GemFire configuration setting.
*
* @return a boolean value indicating whether shared configuration use has been enabled or not.
*/
public Boolean getUseClusterConfiguration() {
return this.useClusterConfiguration;
}
public static class DynamicRegionSupport {
private Boolean persistent = Boolean.TRUE;
private Boolean registerInterest = Boolean.TRUE;
private String diskDirectory;
private String poolName;
public void setDiskDir(String diskDirectory) {
this.diskDirectory = diskDirectory;
}
public String getDiskDir() {
return diskDirectory;
}
public void setPersistent(Boolean persistent) {
this.persistent = persistent;
}
public Boolean getPersistent() {
return persistent;
}
public void setPoolName(String poolName) {
this.poolName = poolName;
}
public String getPoolName() {
return poolName;
}
public void setRegisterInterest(Boolean registerInterest) {
this.registerInterest = registerInterest;
}
public Boolean getRegisterInterest() {
return registerInterest;
}
public void initializeDynamicRegionFactory() {
File localDiskDirectory = (this.diskDirectory != null ? new File(this.diskDirectory) : null);
DynamicRegionFactory.Config config = new DynamicRegionFactory.Config(localDiskDirectory, poolName,
persistent, registerInterest);
DynamicRegionFactory.get().open(config);
}
}
public static class JndiDataSource {
private List<ConfigProperty> props;
private Map<String, String> attributes;
public Map<String, String> getAttributes() {
return attributes;
}
public void setAttributes(Map<String, String> attributes) {
this.attributes = attributes;
}
public List<ConfigProperty> getProps() {
return props;
}
public void setProps(List<ConfigProperty> props) {
this.props = props;
}
}
}