package org.infinispan.distribution.group;
/**
* <p>
* User applications may implement this interface in order to customize the compution of groups in cases when the modifying the
* key is not possible, or when the value determined by the {@link Group} annotation needs customizing.
* </p>
*
* <p>
* <code>Grouper</code> acts as an interceptor, passing the previously computed value in. The group passed to the first
* <code>Grouper</code> will be that determined by <code>@Group</code> (if <code>@Group</code> is defined).
* </p>
*
* <p>
* For example:
* </p>
*
* <pre>
* public class KXGrouper implements Grouper<String> {
*
* // A pattern that can extract from a "kX" (e.g. k1, k2) style key
* private static Pattern kPattern = Pattern.compile("(ˆk)(\\d)$");
*
* public String computeGroup(String key, String group) {
* Matcher matcher = kPattern.matcher(key);
* if (matcher.matches()) {
* String g = Integer.parseInt(matcher.group(2)) % 2 + "";
* return g;
* } else
* return null;
* }
*
* public Class<String> getKeyType() {
* return String.class;
* }
*
* }
* </pre>
*
* <p>
* You must set the
* <code>groupsEnabled<code> property to true in your configuration in order to use groups. You can specify an order list of groupers there.
* </p>
*
* @see Group
*
* @author Pete Muir
*
* @param <T>
*/
public interface Grouper<T> {
/**
* Compute the group for a given key
*
* @param key the key to compute the group for
* @param group the group as currently computed, or null if no group has been determined yet
* @return the group, or null if no group is defined
*/
String computeGroup(T key, String group);
Class<T> getKeyType();
}