package org.radargun.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachemanagerlistener.annotation.Merged;
import org.infinispan.notifications.cachemanagerlistener.annotation.ViewChanged;
import org.infinispan.notifications.cachemanagerlistener.event.MergeEvent;
import org.infinispan.notifications.cachemanagerlistener.event.ViewChangedEvent;
import org.infinispan.remoting.transport.Address;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.traits.Clustered;
/**
* @author Radim Vansa <rvansa@redhat.com>
*/
@Listener
public class InfinispanClustered implements Clustered {
protected static final Log log = LogFactory.getLog(InfinispanClustered.class);
protected final InfinispanEmbeddedService service;
protected final List<Membership> membershipHistory = new ArrayList<Membership>();
public InfinispanClustered(InfinispanEmbeddedService service) {
this.service = service;
}
@Override
public boolean isCoordinator() {
return service.lifecycle.isRunning() && service.cacheManager.isCoordinator();
}
@ViewChanged
public synchronized void viewChanged(ViewChangedEvent e) {
membershipHistory.add(Membership.create(convert(e.getNewMembers())));
}
@Merged
public synchronized void viewMerged(MergeEvent e) {
membershipHistory.add(Membership.create(convert(e.getNewMembers())));
}
public synchronized void stopped() {
membershipHistory.add(Membership.empty());
}
@Override
public synchronized Collection<Member> getMembers() {
if (membershipHistory.isEmpty()) return null;
return membershipHistory.get(membershipHistory.size() - 1).members;
}
private Collection<Member> convert(List<Address> addresses) {
Collection<Member> members = new ArrayList<>(addresses.size());
boolean coord = true;
for (Address address : addresses) {
members.add(new Member(address.toString(), service.cacheManager.getAddress().equals(address), coord));
coord = false;
}
return members;
}
@Override
public synchronized List<Membership> getMembershipHistory() {
return new ArrayList<>(membershipHistory);
}
}