package org.infinispan.factories;
import org.infinispan.configuration.cache.EvictionConfiguration;
import org.infinispan.configuration.cache.MemoryConfiguration;
import org.infinispan.container.DataContainer;
import org.infinispan.container.DefaultDataContainer;
import org.infinispan.configuration.cache.StorageType;
import org.infinispan.container.offheap.BoundedOffHeapDataContainer;
import org.infinispan.container.offheap.OffHeapDataContainer;
import org.infinispan.factories.annotations.DefaultFactoryFor;
/**
* Constructs the data container
*
* @author Manik Surtani (<a href="mailto:manik@jboss.org">manik@jboss.org</a>)
* @author Vladimir Blagojevic
* @since 4.0
*/
@DefaultFactoryFor(classes = DataContainer.class)
public class DataContainerFactory extends AbstractNamedCacheComponentFactory implements
AutoInstantiableFactory {
@Override
@SuppressWarnings("unchecked")
public <T> T construct(Class<T> componentType) {
if (configuration.dataContainer().dataContainer() != null) {
return (T) configuration.dataContainer().dataContainer();
} else {
int level = configuration.locking().concurrencyLevel();
long thresholdSize = configuration.memory().size();
//handle case when < 0 value signifies unbounded container
if(thresholdSize < 0) {
if (configuration.memory().storageType() == StorageType.OFF_HEAP) {
return (T) new OffHeapDataContainer(configuration.memory().addressCount());
} else {
return (T) DefaultDataContainer.unBoundedDataContainer(level);
}
}
DataContainer dataContainer;
if (configuration.memory().storageType() == StorageType.OFF_HEAP) {
dataContainer = new BoundedOffHeapDataContainer(configuration.memory().addressCount(), thresholdSize,
configuration.memory().evictionType());
} else {
dataContainer = DefaultDataContainer.boundedDataContainer(level, thresholdSize,
configuration.memory().evictionType());
}
configuration.eviction().attributes().attribute(EvictionConfiguration.SIZE).addListener((newSize, old) ->
configuration.memory().size(newSize.get()));
configuration.memory().attributes().attribute(MemoryConfiguration.SIZE).addListener((newSize, old) ->
dataContainer.resize(newSize.get()));
return (T) dataContainer;
}
}
}