package org.infinispan.config; import org.infinispan.config.FluentConfiguration.GroupsConfig; import org.infinispan.distribution.group.Grouper; import org.infinispan.util.Util; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import java.util.AbstractList; import java.util.LinkedList; import java.util.List; @XmlAccessorType(XmlAccessType.PROPERTY) @ConfigurationDoc(name="groups",desc="Configuration for various grouper definitions. See the user guide for more information") public class GroupsConfiguration extends AbstractFluentConfigurationBean implements GroupsConfig { List<Grouper<?>> groupers = new LinkedList<Grouper<?>>(); @ConfigurationDocRef(targetElement = "enabled", bean = GroupsConfiguration.class) Boolean enabled = false; public void accept(ConfigurationBeanVisitor v) { v.visitGroupConfig(this); } @XmlElement(name = "grouper") public List<GrouperConfiguration> getGroupGeneratorConfigurations() { return new AbstractList<GrouperConfiguration>() { @Override public GrouperConfiguration get(int index) { return new GrouperConfiguration(groupers.get(index).getClass()); } @Override public boolean add(GrouperConfiguration e) { return groupers.add(new LazyGrouper<Object>(e.getClazz())); } @Override public int size() { return groupers.size(); } }; } private class LazyGrouper<T> implements Grouper<T> { private final String className; private transient Grouper<T> delegate; public LazyGrouper(String className) { this.className = className; } @Override public String computeGroup(T key, String group) { return delegate().computeGroup(key, group); } @Override public Class<T> getKeyType() { return delegate().getKeyType(); } private Grouper<T> delegate() { if (delegate == null) delegate = Util.getInstance(className, config.getClassLoader()); return delegate; } } @Override public Boolean isEnabled() { return enabled; } @XmlAttribute(name = "enabled") public void setEnabled(Boolean enabled) { enabled(enabled); } /** * Enable grouping support * */ @Override public GroupsConfig enabled(Boolean enabled) { this.enabled = enabled; testImmutability("enabled"); return this; } @Override public GroupsConfig groupers(List<Grouper<?>> groupers) { this.groupers = groupers; testImmutability("groupers"); return this; } @Override public List<Grouper<?>> getGroupers() { return this.groupers; } public boolean equals(Object obj) { if (obj instanceof GroupsConfiguration) { GroupsConfiguration that = (GroupsConfiguration) obj; if (this.enabled != null && !this.enabled.equals(that.enabled)) return false; else if (this.groupers != null && !this.groupers.equals(that.groupers)) return false; else return true; } else return false; } public int hashCode() { int result = enabled != null ? enabled.hashCode() : 0; result = 31 * result + (groupers != null ? groupers.hashCode() : 0); return result; } @Override public GroupsConfiguration clone() throws CloneNotSupportedException { GroupsConfiguration dolly = (GroupsConfiguration) super.clone(); dolly.enabled = enabled; dolly.groupers = new LinkedList<Grouper<?>>(); for (Grouper<?> g : groupers) { dolly.groupers.add(g); } return dolly; } }