/* * 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.transaction; import org.jboss.cache.Fqn; import org.jboss.cache.commands.WriteCommand; import org.jboss.cache.config.Option; import org.jboss.cache.interceptors.OrderedSynchronizationHandler; import javax.transaction.Transaction; import java.util.List; /** * Captures information pertaining to a specific JTA transaction. *

* This was a concrete class called TransactionEntry prior to 3.0. *

* * @author Manik Surtani (manik AT jboss DOT org) * @see org.jboss.cache.InvocationContext */ public interface TransactionContext { /** * Adds a modification to the modification list. * * @param command modification */ void addModification(WriteCommand command); /** * Returns all modifications. If there are no modifications in this transaction this method will return an empty list. * * @return list of modifications. */ List getModifications(); /** * Adds a modification to the local modification list. * * @param command command to add to list. Should not be null. * @throws NullPointerException if the command to be added is null. */ void addLocalModification(WriteCommand command); /** * Returns all modifications that have been invoked with the LOCAL cache mode option. These will also be in the standard modification list. * * @return list of LOCAL modifications, or an empty list. */ List getLocalModifications(); /** * Adds the node that has been removed in the scope of the current transaction. * * @param fqn fqn that has been removed. * @throws NullPointerException if the Fqn is null. */ void addRemovedNode(Fqn fqn); /** * Gets the list of removed nodes. * * @return list of nodes removed in the current transaction scope. Note that this method will return an empty list if nothing has been removed. The list returned is defensively copied. */ List getRemovedNodes(); /** * Sets the local transaction to be associated with this transaction context. * * @param tx JTA transaction to associate with. */ void setTransaction(Transaction tx); /** * Returns a local transaction associated with this context. * * @return a JTA transaction */ Transaction getTransaction(); /** * Adds a lock to the currently maintained collection of locks acquired. *

* Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#addLock(Object)} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. *

* Note that currently (as of 3.0.0) this lock is weakly typed. This is to allow support for both MVCC (which uses {@link org.jboss.cache.Fqn}s as locks) * as well as legacy Optimistic and Pessimistic Locking schemes (which use {@link org.jboss.cache.lock.NodeLock} as locks). Once support for * legacy node locking schemes are dropped, this method will be more strongly typed to accept {@link org.jboss.cache.Fqn}. * * @param lock lock to add * @see org.jboss.cache.InvocationContext#addLock(Object) */ @SuppressWarnings("unchecked") void addLock(Object lock); /** * Removes a lock from the currently maintained collection of locks acquired. *

* Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#removeLock(Object)} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. *

* Note that currently (as of 3.0.0) this lock is weakly typed. This is to allow support for both MVCC (which uses {@link org.jboss.cache.Fqn}s as locks) * as well as legacy Optimistic and Pessimistic Locking schemes (which use {@link org.jboss.cache.lock.NodeLock} as locks). Once support for * legacy node locking schemes are dropped, this method will be more strongly typed to accept {@link org.jboss.cache.Fqn}. * * @param lock lock to remove * @see org.jboss.cache.InvocationContext#removeLock(Object) */ @SuppressWarnings("unchecked") void removeLock(Object lock); /** * Clears all locks from the currently maintained collection of locks acquired. *

* Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#clearLocks()} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. *

* Note that currently (as of 3.0.0) this lock is weakly typed. This is to allow support for both MVCC (which uses {@link org.jboss.cache.Fqn}s as locks) * as well as legacy Optimistic and Pessimistic Locking schemes (which use {@link org.jboss.cache.lock.NodeLock} as locks). Once support for * legacy node locking schemes are dropped, this method will be more strongly typed to accept {@link org.jboss.cache.Fqn}. * * @see org.jboss.cache.InvocationContext#clearLocks() */ void clearLocks(); /** * Adds a List of locks to the currently maintained collection of locks acquired. *

* Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#addAllLocks(java.util.List)} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. *

* Note that currently (as of 3.0.0) this list is unchecked. This is to allow support for both MVCC (which uses Fqns as locks) * as well as legacy Optimistic and Pessimistic Locking schemes (which use {@link org.jboss.cache.lock.NodeLock} as locks). Once support for * legacy node locking schemes are dropped, this method will be more strongly typed to accept List. * * @param newLocks locks to add * @see org.jboss.cache.InvocationContext#addAllLocks(java.util.List) */ @SuppressWarnings("unchecked") void addAllLocks(List newLocks); /** * Returns an immutable, defensive copy of the List of locks currently maintained for the transaction. *

* Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#getLocks()} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. *

* Note that currently (as of 3.0.0) this list is unchecked. This is to allow support for both MVCC (which uses Fqns as locks) * as well as legacy Optimistic and Pessimistic Locking schemes (which use {@link org.jboss.cache.lock.NodeLock} as locks). Once support for * legacy node locking schemes are dropped, this method will be more strongly typed to return List. * * @return locks held in current scope. * @see org.jboss.cache.InvocationContext#getLocks() */ @SuppressWarnings("unchecked") List getLocks(); /** * Most code could not use this method directly, but use {@link org.jboss.cache.InvocationContext#hasLock(Object)} ()} instead, * which would delegate to this method if a transaction is in scope or otherwise use invocation-specific locks. * * @param lock lock to test * @return true if the lock being tested is already held in the current scope, false otherwise. */ boolean hasLock(Object lock); /** * Gets the value of the forceAsyncReplication flag. Used by ReplicationInterceptor and OptimisticReplicationInterceptor * when dealing with {@link org.jboss.cache.Cache#putForExternalRead(org.jboss.cache.Fqn,Object,Object)} within * a transactional context. * * @return true if the forceAsyncReplication flag is set to true. */ boolean isForceAsyncReplication(); /** * Sets the value of the forceAsyncReplication flag. Used by ReplicationInterceptor and OptimisticReplicationInterceptor * when dealing with {@link org.jboss.cache.Cache#putForExternalRead(org.jboss.cache.Fqn,Object,Object)} within * a transactional context. Also used by OptimisticReplicationInterceptor when dealing * with {@link org.jboss.cache.config.Option#setForceAsynchronous(boolean)} in a * non-transactional context (i.e. with an implicit transaction). * * @param forceAsyncReplication value of forceAsyncReplication */ void setForceAsyncReplication(boolean forceAsyncReplication); /** * Gets the value of the forceSyncReplication flag. Used by ReplicationInterceptor and OptimisticReplicationInterceptor * when dealing with {@link org.jboss.cache.Cache#putForExternalRead(org.jboss.cache.Fqn,Object,Object)} within * a transactional context. * * @return true if the forceAsyncReplication flag is set to true. */ boolean isForceSyncReplication(); /** * Sets the value of the forceSyncReplication flag. Used by ReplicationInterceptor and OptimisticReplicationInterceptor * when dealing with {@link org.jboss.cache.Cache#putForExternalRead(org.jboss.cache.Fqn,Object,Object)} within * a transactional context. * * @param forceSyncReplication value of forceSyncReplication */ void setForceSyncReplication(boolean forceSyncReplication); /** * Adds an Fqn to the list of uninitialized nodes created by the cache loader. * * @param fqn fqn to add. Must not be null. */ void addDummyNodeCreatedByCacheLoader(Fqn fqn); /** * @return a list of uninitialized nodes created by the cache loader, or an empty list. */ List getDummyNodesCreatedByCacheLoader(); /** * Sets a transaction-scope option override * * @param o option to set */ void setOption(Option o); /** * Retrieves a transaction scope option override * * @return option */ Option getOption(); /** * @return the ordered sync handler associated with this transaction */ OrderedSynchronizationHandler getOrderedSynchronizationHandler(); /** * Associates an ordered sync handler with this transaction. * * @param orderedSynchronizationHandler to set */ void setOrderedSynchronizationHandler(OrderedSynchronizationHandler orderedSynchronizationHandler); /** * @return true if modifications were registered. */ boolean hasModifications(); /** * @return true if any modifications have been invoked with cache mode being LOCAL. */ boolean hasLocalModifications(); /** * @return true if either there are modifications or local modifications that are not for replicating. */ boolean hasAnyModifications(); /** * Cleans up internal state, freeing up references. */ void reset(); }