package org.infinispan.factories;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.Configurations;
import org.infinispan.container.versioning.NumericVersionGenerator;
import org.infinispan.container.versioning.SimpleClusteredVersionGenerator;
import org.infinispan.container.versioning.VersionGenerator;
import org.infinispan.factories.annotations.DefaultFactoryFor;
import org.infinispan.factories.annotations.Inject;
import org.infinispan.factories.scopes.Scope;
import org.infinispan.factories.scopes.Scopes;
/**
* Version generator component factory. Version generators are used for situations where version or ids are needed, e.g.
* data versioning, transaction recovery, or hotrod/memcached support.
*
* @author Manik Surtani
* @author Galder ZamarreƱo
* @since 5.1
*/
@DefaultFactoryFor(classes = VersionGenerator.class)
@Scope(Scopes.NAMED_CACHE)
public class VersionGeneratorFactory extends NamedComponentFactory implements AutoInstantiableFactory {
private Configuration configuration;
@Override
public <T> T construct(Class<T> componentType, String componentName) {
if (KnownComponentNames.TRANSACTION_VERSION_GENERATOR.endsWith(componentName)) {
return componentType.cast(new NumericVersionGenerator());
}
if (Configurations.isTxVersioned(configuration)) {
return configuration.clustering().cacheMode().isClustered() ?
componentType.cast(new SimpleClusteredVersionGenerator()) :
componentType.cast(new NumericVersionGenerator());
} else {
return componentType.cast(new NumericVersionGenerator());
}
}
@Inject
private void injectGlobalDependencies(Configuration configuration) {
this.configuration = configuration;
}
}