/*
* JBoss, Home of Professional Open Source
* Copyright 2009 Red Hat Inc. and/or its affiliates and other
* contributors as indicated by the @author tags. All rights reserved.
* See the copyright.txt 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.infinispan;
import org.infinispan.atomic.Delta;
import org.infinispan.batch.BatchContainer;
import org.infinispan.container.DataContainer;
import org.infinispan.context.Flag;
import org.infinispan.context.InvocationContextContainer;
import org.infinispan.distribution.DistributionManager;
import org.infinispan.eviction.EvictionManager;
import org.infinispan.factories.ComponentRegistry;
import org.infinispan.interceptors.base.CommandInterceptor;
import org.infinispan.remoting.rpc.RpcManager;
import org.infinispan.stats.Stats;
import org.infinispan.util.concurrent.locks.LockManager;
import javax.transaction.TransactionManager;
import javax.transaction.xa.XAResource;
import java.util.Collection;
import java.util.List;
/**
* An advanced interface that exposes additional methods not available on {@link Cache}.
*
* @author Manik Surtani
* @since 4.0
*/
public interface AdvancedCache<K, V> extends Cache<K, V> {
/**
* A method that adds flags to any API call. For example, consider the following code snippet:
* <pre>
* cache.withFlags(Flag.FORCE_WRITE_LOCK).get(key);
* </pre>
* will invoke a cache.get() with a write lock forced.
* <p />
* <b>Note</b> that for the flag to take effect, the cache operation <b>must</b> be invoked on the instance returned by
* this method.
* <p />
* As an alternative to setting this on every
* invocation, users could also consider using the {@link DecoratedCache} wrapper, as this allows for more readable
* code. E.g.:
* <pre>
* Cache forceWriteLockCache = new DecoratedCache(cache, Flag.FORCE_WRITE_LOCK);
* forceWriteLockCache.get(key1);
* forceWriteLockCache.get(key2);
* forceWriteLockCache.get(key3);
* </pre>
*
* @param flags a set of flags to apply. See the {@link Flag} documentation.
* @return an {@link AdvancedCache} instance on which a real operation is to be invoked, if the flags are
* to be applied.
*/
AdvancedCache<K, V> withFlags(Flag... flags);
/**
* Adds a custom interceptor to the interceptor chain, at specified position, where the first interceptor in the
* chain is at position 0 and the last one at NUM_INTERCEPTORS - 1.
*
* @param i the interceptor to add
* @param position the position to add the interceptor
*/
void addInterceptor(CommandInterceptor i, int position);
/**
* Adds a custom interceptor to the interceptor chain, after an instance of the specified interceptor type. Throws a
* cache exception if it cannot find an interceptor of the specified type.
*
* @param i interceptor to add
* @param afterInterceptor interceptor type after which to place custom interceptor
* @return true if successful, false otherwise.
*/
boolean addInterceptorAfter(CommandInterceptor i, Class<? extends CommandInterceptor> afterInterceptor);
/**
* Adds a custom interceptor to the interceptor chain, before an instance of the specified interceptor type. Throws a
* cache exception if it cannot find an interceptor of the specified type.
*
* @param i interceptor to add
* @param beforeInterceptor interceptor type before which to place custom interceptor
* @return true if successful, false otherwise.
*/
boolean addInterceptorBefore(CommandInterceptor i, Class<? extends CommandInterceptor> beforeInterceptor);
/**
* Removes the interceptor at a specified position, where the first interceptor in the chain is at position 0 and the
* last one at getInterceptorChain().size() - 1.
*
* @param position the position at which to remove an interceptor
*/
void removeInterceptor(int position);
/**
* Removes the interceptor of specified type.
*
* @param interceptorType type of interceptor to remove
*/
void removeInterceptor(Class<? extends CommandInterceptor> interceptorType);
/**
* Retrieves the current Interceptor chain.
*
* @return an immutable {@link java.util.List} of {@link org.infinispan.interceptors.base.CommandInterceptor}s
* configured for this cache
*/
List<CommandInterceptor> getInterceptorChain();
/**
* @return the eviction manager - if one is configured - for this cache instance
*/
EvictionManager getEvictionManager();
/**
* @return the component registry for this cache instance
*/
ComponentRegistry getComponentRegistry();
/**
* Retrieves a reference to the {@link org.infinispan.distribution.DistributionManager} if the cache is configured
* to use Distribution. Otherwise, returns a null.
* @return a DistributionManager, or null.
*/
DistributionManager getDistributionManager();
/**
* Locks a given key or keys eagerly across cache nodes in a cluster.
* <p>
* Keys can be locked eagerly in the context of a transaction only.
*
* @param keys the keys to lock
* @return true if the lock acquisition attempt was successful for <i>all</i> keys;
* false will only be returned if the lock acquisition timed out and the
* operation has been called with {@link Flag#FAIL_SILENTLY}.
* @throws org.infinispan.util.concurrent.TimeoutException if the lock
* cannot be acquired within the configured lock acquisition time.
*/
boolean lock(K... keys);
/**
* Locks collections of keys eagerly across cache nodes in a cluster.
* <p>
* Collections of keys can be locked eagerly in the context of a transaction only.
*
* @param keys collection of keys to lock
* @return true if the lock acquisition attempt was successful for <i>all</i> keys;
* false will only be returned if the lock acquisition timed out and the
* operation has been called with {@link Flag#FAIL_SILENTLY}.
* @throws org.infinispan.util.concurrent.TimeoutException if the lock
* cannot be acquired within the configured lock acquisition time.
*/
boolean lock(Collection<? extends K> keys);
/**
* Applies the given Delta to the DeltaAware object stored under deltaAwareValueKey if and only if all
* locksToAcquire locks are successfully obtained
*
*
* @param deltaAwareValueKey the key for DeltaAware object
* @param delta the delta to be applied to DeltaAware object
* @param locksToAcquire keys to be locked in DeltaAware scope
*/
void applyDelta(K deltaAwareValueKey, Delta delta, Object... locksToAcquire);
/**
* Returns the component in charge of communication with other caches in
* the cluster. If the cache's {@link org.infinispan.config.Configuration.CacheMode}
* is {@link org.infinispan.config.Configuration.CacheMode#LOCAL}, this
* method will return null.
*
* @return the RPC manager component associated with this cache instance or null
*/
RpcManager getRpcManager();
/**
* Returns the component in charge of batching cache operations.
*
* @return the batching component associated with this cache instance
*/
BatchContainer getBatchContainer();
/**
* Returns the component in charge of managing the interactions between the
* cache operations and the context information associated with them.
*
* @return the invocation context container component
*/
InvocationContextContainer getInvocationContextContainer();
/**
* Returns the container where data is stored in the cache. Users should
* interact with this component with care because direct calls on it bypass
* the internal interceptors and other infrastructure in place to guarantee
* the consistency of data.
*
* @return the data container associated with this cache instance
*/
DataContainer getDataContainer();
/**
* Returns the transaction manager configured for this cache. If no
* transaction manager was configured, this method returns null.
*
* @return the transaction manager associated with this cache instance or null
*/
TransactionManager getTransactionManager();
/**
* Returns the component that deals with all aspects of acquiring and
* releasing locks for cache entries.
*
* @return retrieves the lock manager associated with this cache instance
*/
LockManager getLockManager();
/**
* Returns a {@link Stats} object that allows several statistics associated
* with this cache at runtime.
*
* @return this cache's {@link Stats} object
*/
Stats getStats();
/**
* Returns the {@link XAResource} associated with this cache which can be
* used to do transactional recovery.
*
* @return an instance of {@link XAResource}
*/
XAResource getXAResource();
/**
* Returns the cache loader associated associated with this cache. As an alternative to setting this on every
* invocation, users could also consider using the {@link DecoratedCache} wrapper.
*
* @return this cache's cache loader
*/
ClassLoader getClassLoader();
/**
* Using this operation, users can call any {@link AdvancedCache} operation
* with a given {@link ClassLoader}. This means that any {@link ClassLoader} happening
* as a result of the cache operation will be done using the {@link ClassLoader}
* given. For example:
* <p />
* When users store POJO instances in caches configured with {@link org.infinispan.config.Configuration#storeAsBinary},
* these instances are transformed into byte arrays. When these entries are
* read from the cache, a lazy unmarshalling process happens where these byte
* arrays are transformed back into POJO instances. Using {@link AdvancedCache#with(ClassLoader)}
* when reading that enables users to provide the class loader that should
* be used when trying to locate the classes that are constructed as a result
* of the unmarshalling process.
* <pre>
* cache.with(classLoader).get(key);
* </pre>
* <b>Note</b> that for the flag to take effect, the cache operation <b>must</b> be invoked on the instance
* returned by this method.
* <p />
* As an alternative to setting this on every
* invocation, users could also consider using the {@link DecoratedCache} wrapper, as this allows for more readable
* code. E.g.:
* <pre>
* Cache classLoaderSpecificCache = new DecoratedCache(cache, classLoader);
* classLoaderSpecificCache.get(key1);
* classLoaderSpecificCache.get(key2);
* classLoaderSpecificCache.get(key3);
* </pre>
*
* @return an {@link AdvancedCache} instance upon which operations can be called
* with a particular {@link ClassLoader}.
*/
AdvancedCache<K, V> with(ClassLoader classLoader);
}