/* * 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; import net.jcip.annotations.ThreadSafe; import org.jboss.cache.buddyreplication.BuddyManager; import org.jboss.cache.buddyreplication.GravitateResult; import org.jboss.cache.factories.ComponentRegistry; import org.jboss.cache.interceptors.base.CommandInterceptor; import org.jboss.cache.loader.CacheLoader; import org.jboss.cache.loader.CacheLoaderManager; import org.jboss.cache.marshall.Marshaller; import org.jboss.cache.notifications.Notifier; import org.jboss.cache.statetransfer.StateTransferManager; import org.jboss.cache.transaction.GlobalTransaction; import org.jboss.cache.transaction.TransactionTable; import javax.transaction.Transaction; import javax.transaction.TransactionManager; import java.util.List; import java.util.Set; /** * A more detailed interface to {@link Cache}, which is used when writing plugins for or extending JBoss Cache. A reference * to this interface should only be obtained when it is passed in to your code, for example when you write an * {@link org.jboss.cache.interceptors.base.CommandInterceptor} or {@link CacheLoader}. *

* You should NEVER attempt to directly cast a {@link Cache} instance to this interface. In future, the implementation may not allow it. *

* This interface contains overridden method signatures of some methods from {@link Cache}, overridden to ensure return * types of {@link Node} are replaced with {@link NodeSPI}. *

* * @author Manik Surtani (manik AT jboss DOT org) * @see NodeSPI * @see Cache * @see org.jboss.cache.loader.CacheLoader * @since 2.0.0 */ @ThreadSafe public interface CacheSPI extends Cache { /** * Overrides {@link org.jboss.cache.Cache#getRoot()} to return a {@link org.jboss.cache.NodeSPI} instead of a {@link org.jboss.cache.Node}. */ NodeSPI getRoot(); /** * Overrides {@link Cache#getNode(String)} to return a {@link org.jboss.cache.NodeSPI} instead of a {@link org.jboss.cache.Node}. * * @param s string representation of an Fqn * @return a NodeSPI */ NodeSPI getNode(String s); /** * Overrides {@link Cache#getNode(Fqn)} to return a {@link org.jboss.cache.NodeSPI} instead of a {@link org.jboss.cache.Node}. * * @param f an Fqn * @return a NodeSPI */ NodeSPI getNode(Fqn f); /** * Retrieves a reference to a running {@link javax.transaction.TransactionManager}, if one is configured. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return a TransactionManager */ TransactionManager getTransactionManager(); /** * Retrieves the current Interceptor chain. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return an immutable {@link List} of {@link org.jboss.cache.interceptors.base.CommandInterceptor}s configured for this cache, or * null if {@link Cache#create() create()} has not been invoked * and the interceptors thus do not exist. */ List getInterceptorChain(); /** * Retrieves an instance of a {@link Marshaller}, which is capable of * converting Java objects to bytestreams and back in an efficient manner, which is * also interoperable with bytestreams produced/consumed by other versions of JBoss * Cache. *

* The use of this marshaller is the recommended way of creating efficient, * compatible, byte streams from objects. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return an instance of {@link Marshaller} */ Marshaller getMarshaller(); /** * Retrieves the current CacheCacheLoaderManager instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return Retrieves a reference to the currently configured {@link org.jboss.cache.loader.CacheLoaderManager} if one or more cache loaders are configured, null otherwise. */ CacheLoaderManager getCacheLoaderManager(); /** * Retrieves the current BuddyManager instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return an instance of {@link BuddyManager} if buddy replication is enabled, null otherwise. */ BuddyManager getBuddyManager(); /** * Retrieves the current TransactionTable instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return the current {@link TransactionTable} */ TransactionTable getTransactionTable(); /** * Gets a handle of the RPC manager. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return the {@link org.jboss.cache.RPCManager} configured. */ RPCManager getRPCManager(); /** * Retrieves the current StateTransferManager instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return the current {@link org.jboss.cache.statetransfer.StateTransferManager} */ StateTransferManager getStateTransferManager(); /** * Retrieves the current RegionManager instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return the {@link RegionManager} */ RegionManager getRegionManager(); /** * Retrieves the current Notifier instance associated with the current Cache instance. *

* From 2.1.0, Interceptor authors should obtain this by injection rather than this method. See the * {@link org.jboss.cache.factories.annotations.Inject} annotation. * * @return the notifier attached with this instance of the cache. See {@link org.jboss.cache.notifications.Notifier}, a class * that is responsible for emitting notifications to registered CacheListeners. */ Notifier getNotifier(); /** * @return the name of the cluster. Null if running in local mode. */ String getClusterName(); /** * @return the number of attributes in the cache. */ int getNumberOfAttributes(); /** * @return the number of nodes in the cache. */ int getNumberOfNodes(); /** * Returns the global transaction for this local transaction. * Optionally creates a new global transaction if it does not exist. * * @param tx the current transaction * @param createIfNotExists if true creates a new transaction if none exists * @return a GlobalTransaction */ GlobalTransaction getCurrentTransaction(Transaction tx, boolean createIfNotExists); /** * Returns the transaction associated with the current thread. * If a local transaction exists, but doesn't yet have a mapping to a * GlobalTransaction, a new GlobalTransaction will be created and mapped to * the local transaction. Note that if a local transaction exists, but is * not ACTIVE or PREPARING, null is returned. * * @return A GlobalTransaction, or null if no (local) transaction was associated with the current thread */ GlobalTransaction getCurrentTransaction(); /** * Returns a node without accessing the interceptor chain. Does not return any nodes marked as invalid. Note that this call works * directly on the cache data structure and will not pass through the interceptor chain. Hence node locking, cache * loading or activation does not take place, and so the results of this call should not be treated as definitive. Concurrent node * removal, passivation, etc. may affect the results of this call. * * @param fqn the Fqn to look up. * @param includeDeletedNodes if you intend to see nodes marked as deleted within the current tx, set this to true * @return a node if one exists or null */ NodeSPI peek(Fqn fqn, boolean includeDeletedNodes); /** * Returns a node without accessing the interceptor chain, optionally returning nodes that are marked as invalid ({@link org.jboss.cache.Node#isValid()} == false). * Note that this call works * directly on the cache data structure and will not pass through the interceptor chain. Hence node locking, cache * loading or activation does not take place, and so the results of this call should not be treated as definitive. Concurrent node * removal, passivation, etc. may affect the results of this call. * * @param fqn the Fqn to look up. * @param includeDeletedNodes if you intend to see nodes marked as deleted within the current tx, set this to true * @param includeInvalidNodes if true, nodes marked as being invalid are also returned. * @return a node if one exists or null */ NodeSPI peek(Fqn fqn, boolean includeDeletedNodes, boolean includeInvalidNodes); /** * Used with buddy replication's data gravitation interceptor. If marshalling is necessary, ensure that the cache is * configured to use {@link org.jboss.cache.config.Configuration#useRegionBasedMarshalling} and the {@link org.jboss.cache.Region} * pertaining to the Fqn passed in is activated, and has an appropriate ClassLoader. * * @param fqn the fqn to gravitate * @param searchBuddyBackupSubtrees if true, buddy backup subtrees are searched and if false, they are not. * @param ctx * @return a GravitateResult which contains the data for the gravitation */ GravitateResult gravitateData(Fqn fqn, boolean searchBuddyBackupSubtrees, InvocationContext ctx); /** * Returns a Set of Fqns of the topmost node of internal regions that * should not included in standard state transfers. Will include * {@link BuddyManager#BUDDY_BACKUP_SUBTREE} if buddy replication is * enabled. * * @return an unmodifiable Set. Will not return null. */ Set getInternalFqns(); int getNumberOfLocksHeld(); /** * Helper method that does a peek and ensures that the result of the peek is not null. Note that this call works * directly on the cache data structure and will not pass through the interceptor chain. Hence node locking, cache * loading or activation does not take place, and so the results of this call should not be treated as definitive. * * @param fqn Fqn to peek * @return true if the peek returns a non-null value. */ boolean exists(Fqn fqn); /** * A convenience method that takes a String representation of an Fqn. Otherwise identical to {@link #exists(Fqn)}. * Note that this call works * directly on the cache data structure and will not pass through the interceptor chain. Hence node locking, cache * loading or activation does not take place, and so the results of this call should not be treated as definitive. */ boolean exists(String fqn); /** * Returns the component registry associated with this cache instance. * * @see org.jboss.cache.factories.ComponentRegistry */ ComponentRegistry getComponentRegistry(); }