/*
* Copyright 2011 Red Hat, Inc. and/or its affiliates.
*
* 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
package org.infinispan.configuration.cache;
import org.infinispan.configuration.AbstractTypedPropertiesConfiguration;
import org.infinispan.util.TypedProperties;
public abstract class AbstractLoaderConfiguration extends AbstractTypedPropertiesConfiguration {
private final boolean purgeOnStartup;
private final boolean purgeSynchronously;
private final int purgerThreads;
private boolean fetchPersistentState;
private boolean ignoreModifications;
private final AsyncLoaderConfiguration async;
private final SingletonStoreConfiguration singletonStore;
AbstractLoaderConfiguration(boolean purgeOnStartup, boolean purgeSynchronously, int purgerThreads, boolean fetchPersistentState,
boolean ignoreModifications, TypedProperties properties, AsyncLoaderConfiguration async, SingletonStoreConfiguration singletonStore) {
super(properties);
this.purgeOnStartup = purgeOnStartup;
this.purgeSynchronously = purgeSynchronously;
this.purgerThreads = purgerThreads;
this.fetchPersistentState = fetchPersistentState;
this.ignoreModifications = ignoreModifications;
this.async = async;
this.singletonStore = singletonStore;
}
/**
* Configuration for the async cache loader. If enabled, this provides you with asynchronous
* writes to the cache store, giving you 'write-behind' caching.
*/
public AsyncLoaderConfiguration async() {
return async;
}
/**
* SingletonStore is a delegating cache store used for situations when only one instance in a
* cluster should interact with the underlying store. The coordinator of the cluster will be
* responsible for the underlying CacheStore. SingletonStore is a simply facade to a real
* CacheStore implementation. It always delegates reads to the real CacheStore.
*/
public SingletonStoreConfiguration singletonStore() {
return singletonStore;
}
/**
* If true, purges this cache store when it starts up.
*/
public boolean purgeOnStartup() {
return purgeOnStartup;
}
/**
* If true, CacheStore#purgeExpired() call will be done synchronously
*/
public boolean purgeSynchronously() {
return purgeSynchronously;
}
/**
* The number of threads to use when purging asynchronously.
*/
public int purgerThreads() {
return purgerThreads;
}
/**
* If true, fetch persistent state when joining a cluster. If multiple cache stores are chained,
* only one of them can have this property enabled. Persistent state transfer with a shared cache
* store does not make sense, as the same persistent store that provides the data will just end
* up receiving it. Therefore, if a shared cache store is used, the cache will not allow a
* persistent state transfer even if a cache store has this property set to true. Finally,
* setting it to true only makes sense if in a clustered environment, and only 'replication' and
* 'invalidation' cluster modes are supported.
*/
public boolean fetchPersistentState() {
return fetchPersistentState;
}
/**
* If true, any operation that modifies the cache (put, remove, clear, store...etc) won't be
* applied to the cache store. This means that the cache store could become out of sync with the
* cache.
*/
public boolean ignoreModifications() {
return ignoreModifications;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AbstractLoaderConfiguration that = (AbstractLoaderConfiguration) o;
if (!super.equals(that)) return false;
if (fetchPersistentState != that.fetchPersistentState) return false;
if (ignoreModifications != that.ignoreModifications) return false;
if (purgeOnStartup != that.purgeOnStartup) return false;
if (purgeSynchronously != that.purgeSynchronously) return false;
if (purgerThreads != that.purgerThreads) return false;
if (async != null ? !async.equals(that.async) : that.async != null)
return false;
if (singletonStore != null ? !singletonStore.equals(that.singletonStore) : that.singletonStore != null)
return false;
return true;
}
@Override
public int hashCode() {
int result = 31 * super.hashCode() + (purgeOnStartup ? 1 : 0);
result = 31 * result + (purgeSynchronously ? 1 : 0);
result = 31 * result + purgerThreads;
result = 31 * result + (fetchPersistentState ? 1 : 0);
result = 31 * result + (ignoreModifications ? 1 : 0);
result = 31 * result + (async != null ? async.hashCode() : 0);
result = 31 * result + (singletonStore != null ? singletonStore.hashCode() : 0);
return result;
}
}