package org.infinispan.distribution.ch.impl;
import org.infinispan.distribution.ch.KeyPartitioner;
import org.infinispan.distribution.group.impl.GroupManager;
import org.infinispan.distribution.group.impl.GroupingPartitioner;
import org.infinispan.factories.AbstractNamedCacheComponentFactory;
import org.infinispan.factories.AutoInstantiableFactory;
import org.infinispan.factories.annotations.DefaultFactoryFor;
import org.infinispan.factories.annotations.Inject;
/**
* Key partitioner factory that uses the hash function defined in the configuration.
*
* In the future, we will probably remove the hash function from the configuration and leave only the
* key partitioner.
*
* @author Dan Berindei
* @since 8.2
*/
@DefaultFactoryFor(classes = KeyPartitioner.class)
public class KeyPartitionerFactory extends AbstractNamedCacheComponentFactory
implements AutoInstantiableFactory {
private GroupManager groupManager;
@Inject
public void inject(GroupManager groupManager) {
this.groupManager = groupManager;
}
@Override
public <T> T construct(Class<T> componentType) {
KeyPartitioner partitioner = configuration.clustering().hash().keyPartitioner();
partitioner.init(configuration.clustering().hash());
if (groupManager == null)
return componentType.cast(partitioner);
// Grouping is enabled. Since the configured partitioner will not be registered in the component
// registry, we need to inject dependencies explicitly.
componentRegistry.wireDependencies(partitioner);
GroupingPartitioner groupingPartitioner = new GroupingPartitioner(partitioner, groupManager);
return componentType.cast(groupingPartitioner);
}
}