package org.infinispan.test.concurrent;
import org.infinispan.Cache;
import org.infinispan.test.TestingUtil;
/**
* Replaces a cache component with a dynamic proxy that can interact with a {@link StateSequencer} when a method that
* matches a {@link InvocationMatcher} is called.
*
* @author Dan Berindei
* @since 7.0
*/
public class CacheComponentSequencerAction<T> extends GlobalComponentSequencerAction<T> {
private final Cache<?, ?> cache;
public CacheComponentSequencerAction(StateSequencer stateSequencer, Cache<?, ?> cache, Class<T> componentClass, InvocationMatcher matcher) {
super(stateSequencer, cache.getCacheManager(), componentClass, matcher);
this.cache = cache;
}
@Override
protected void replaceComponent() {
if (ourHandler == null) {
T component = cache.getAdvancedCache().getComponentRegistry().getComponent(componentClass);
if (component == null) {
throw new IllegalStateException("Attempting to wrap a non-existing component: " + componentClass);
}
ourHandler = new ProxyInvocationHandler(component, stateSequencer, matcher);
T componentProxy = createComponentProxy(componentClass, ourHandler);
TestingUtil.replaceComponent(cache, componentClass, componentProxy, true);
}
}
}