package org.infinispan.counter.impl.interceptor;
import static java.util.EnumSet.of;
import java.util.Collection;
import org.infinispan.commands.write.PutKeyValueCommand;
import org.infinispan.commons.logging.LogFactory;
import org.infinispan.commons.util.EnumUtil;
import org.infinispan.container.entries.CacheEntry;
import org.infinispan.context.Flag;
import org.infinispan.context.InvocationContext;
import org.infinispan.counter.api.CounterConfiguration;
import org.infinispan.counter.api.Storage;
import org.infinispan.counter.logging.Log;
import org.infinispan.interceptors.BaseCustomAsyncInterceptor;
/**
* Interceptor for the counters configuration cache.
* <p>
* Since the state transfer doesn't know about the {@link Flag#SKIP_CACHE_STORE} and {@link Flag#SKIP_CACHE_LOAD} flags,
* all the configuration are persisted. However, we only want the {@link Storage#PERSISTENT} configurations to be
* persisted.
* <p>
* This interceptor checks the configuration's {@link Storage} and sets the {@link Flag#SKIP_CACHE_LOAD} and {@link
* Flag#SKIP_CACHE_STORE} flags.
*
* @author Pedro Ruivo
* @since 9.0
*/
public class CounterConfigurationInterceptor extends BaseCustomAsyncInterceptor {
private static final Log log = LogFactory.getLog(CounterConfigurationInterceptor.class, Log.class);
private static final boolean trace = log.isTraceEnabled();
private static final Collection<Flag> FLAGS_TO_SKIP_PERSISTENCE = of(Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE);
@Override
public Object visitPutKeyValueCommand(InvocationContext ctx, PutKeyValueCommand command)
throws Throwable {
//noinspection unchecked
CacheEntry<String, CounterConfiguration> entry = ctx.lookupEntry(command.getKey());
CounterConfiguration value = entry == null ? null : entry.getValue();
if (value != null && value.storage() == Storage.VOLATILE) {
if (trace) {
log.tracef("Setting skip persistence for %s", command.getKey());
}
command.setFlagsBitSet(EnumUtil.setEnums(command.getFlagsBitSet(), FLAGS_TO_SKIP_PERSISTENCE));
}
return invokeNext(ctx, command);
}
}