/*
* 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.container;
import org.infinispan.atomic.Delta;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.container.entries.InternalCacheEntry;
import org.infinispan.container.entries.MVCCEntry;
import org.infinispan.context.InvocationContext;
/**
* A factory for constructing {@link org.infinispan.container.entries.MVCCEntry} instances for use in the {@link org.infinispan.context.InvocationContext}.
* Implementations of this interface would typically wrap an internal {@link org.infinispan.container.entries.CacheEntry}
* with an {@link org.infinispan.container.entries.MVCCEntry}, optionally acquiring the necessary locks via the
* {@link org.infinispan.util.concurrent.locks.LockManager}.
*
* @author Manik Surtani (<a href="mailto:manik@jboss.org">manik@jboss.org</a>)
* @author Galder ZamarreƱo
* @author Mircea.Markus@jboss.com
* @since 4.0
*/
public interface EntryFactory {
/**
* Wraps an entry for reading. Usually this is just a raw {@link CacheEntry} but certain combinations of isolation
* levels and the presence of an ongoing JTA transaction may force this to be a proper, wrapped MVCCEntry. The entry
* is also typically placed in the invocation context.
*
* @param ctx current invocation context
* @param key key to look up and wrap
* @throws InterruptedException when things go wrong, usually trying to acquire a lock
*/
CacheEntry wrapEntryForReading(InvocationContext ctx, Object key) throws InterruptedException;
/**
* Used for wrapping individual keys when clearing the cache. The wrapped entry is added to the
* supplied InvocationContext.
*/
MVCCEntry wrapEntryForClear(InvocationContext ctx, Object key) throws InterruptedException;
/**
* Used for wrapping a cache entry for replacement. The wrapped entry is added to the
* supplied InvocationContext.
*/
MVCCEntry wrapEntryForReplace(InvocationContext ctx, Object key) throws InterruptedException;
/**
* Used for wrapping a cache entry for removal. The wrapped entry is added to the
* supplied InvocationContext.
*/
MVCCEntry wrapEntryForRemove(InvocationContext ctx, Object key) throws InterruptedException;
/**
* Used for wrapping Delta entry to be applied to DeltaAware object stored in cache. The wrapped
* entry is added to the supplied InvocationContext.
*/
CacheEntry wrapEntryForDelta(InvocationContext ctx, Object deltaKey, Delta delta) throws InterruptedException;
/**
* Used for wrapping a cache entry for addition to cache. The wrapped entry is added to the
* supplied InvocationContext.
*/
MVCCEntry wrapEntryForPut(InvocationContext ctx, Object key, InternalCacheEntry ice, boolean undeleteIfNeeded) throws InterruptedException;
}