package org.infinispan.counter.impl.manager;
import java.util.List;
import org.infinispan.AdvancedCache;
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.counter.api.CounterConfiguration;
import org.infinispan.counter.api.CounterType;
import org.infinispan.counter.api.Storage;
import org.infinispan.counter.configuration.AbstractCounterConfiguration;
import org.infinispan.counter.configuration.StrongCounterConfiguration;
import org.infinispan.counter.configuration.WeakCounterConfiguration;
import org.infinispan.counter.impl.entries.CounterKey;
import org.infinispan.counter.impl.entries.CounterValue;
/**
* It holds the caches used by {@link EmbeddedCounterManager}.
*
* @author Pedro Ruivo
* @since 9.0
*/
public class CacheHolder {
private final AdvancedCache<String, CounterConfiguration> configurationCache;
private final AdvancedCache<? extends CounterKey, CounterValue> counterCache;
private final List<AbstractCounterConfiguration> defaultCounters;
public CacheHolder(AdvancedCache<String, CounterConfiguration> configurationCache,
AdvancedCache<? extends CounterKey, CounterValue> counterCache,
List<AbstractCounterConfiguration> defaultCounters) {
this.configurationCache = configurationCache;
this.counterCache = counterCache;
this.defaultCounters = defaultCounters;
}
boolean addConfiguration(String name, CounterConfiguration configuration) {
CounterConfiguration existing = checkAndStoreConfiguredCounterConfiguration(name);
if (existing != null) {
return false;
}
Cache<String, CounterConfiguration> cache = configuration.storage() == Storage.VOLATILE ?
configurationCache.withFlags(Flag.SKIP_CACHE_STORE, Flag.SKIP_CACHE_LOAD) :
configurationCache;
return cache.putIfAbsent(name, configuration) == null;
}
<K extends CounterKey> AdvancedCache<K, CounterValue> getCounterCache(CounterConfiguration configuration) {
//noinspection unchecked
return (AdvancedCache<K, CounterValue>) (configuration.storage() == Storage.VOLATILE ?
counterCache.withFlags(Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE) :
counterCache);
}
CounterConfiguration getConfiguration(String counterName) {
CounterConfiguration config = configurationCache.get(counterName);
return config == null ? checkAndStoreConfiguredCounterConfiguration(counterName) : config;
}
private CounterConfiguration checkAndStoreConfiguredCounterConfiguration(String counterName) {
for (AbstractCounterConfiguration config : defaultCounters) {
if (config.name().equals(counterName)) {
CounterConfiguration counterConfiguration = createConfigurationEntry(config);
CounterConfiguration existing = configurationCache.putIfAbsent(counterName, counterConfiguration);
return existing == null ? counterConfiguration : existing;
}
}
return null;
}
private static CounterConfiguration createConfigurationEntry(AbstractCounterConfiguration configuration) {
if (configuration instanceof StrongCounterConfiguration) {
if (((StrongCounterConfiguration) configuration).isBound()) {
return CounterConfiguration.builder(CounterType.BOUNDED_STRONG).initialValue(configuration.initialValue())
.lowerBound(((StrongCounterConfiguration) configuration).lowerBound())
.upperBound(((StrongCounterConfiguration) configuration).upperBound())
.storage(configuration.storage()).build();
} else {
return CounterConfiguration.builder(CounterType.UNBOUNDED_STRONG).initialValue(configuration.initialValue())
.storage(configuration.storage()).build();
}
} else if (configuration instanceof WeakCounterConfiguration) {
return CounterConfiguration.builder(CounterType.WEAK).initialValue(configuration.initialValue())
.storage(configuration.storage())
.concurrencyLevel(((WeakCounterConfiguration) configuration).concurrencyLevel()).build();
}
throw new IllegalStateException(
"[should never happen] unknown CounterConfiguration class: " + configuration.getClass());
}
}