package org.radargun.traits; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; /** * @author Radim Vansa <rvansa@redhat.com> */ @Trait(doc = "Information about clustered nodes.") public interface Clustered { /** * @return True if this slave has unique role in the cluster */ boolean isCoordinator(); /** * @return Collection of actual members. Equal to the last entry in {@link #getMembershipHistory()}. * If null, the membership information is unknown. */ Collection<Member> getMembers(); /** * @return Append-only sequence of membership changes. */ List<Membership> getMembershipHistory(); class Member { /** * Plugin-specific name */ public final String name; /** * True if the member is on this slave. */ public final boolean local; /** * True if this member is the leader in the cluster. */ public final boolean coordinator; // TODO: it would be very nice to have getSlaveIndex() here, but we cannot find that out for remote nodes public Member(String name, boolean local, boolean coordinator) { this.name = name; this.local = local; this.coordinator = coordinator; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Member member = (Member) o; if (!name.equals(member.name)) return false; return true; } @Override public int hashCode() { return name.hashCode(); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(name).append("(local=").append(local); sb.append(", coord=").append(coordinator); sb.append(')'); return sb.toString(); } } class Membership { private static final ThreadLocal<DateFormat> FORMATTER = new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("HH:mm:ss,S"); } }; public final Date date; public final Collection<Member> members; public Membership(Date date, Collection<Member> members) { this.date = date; this.members = members; } public static Membership empty() { return new Membership(new Date(), Collections.EMPTY_LIST); } public static Membership create(Collection<Member> members) { return new Membership(new Date(), Collections.unmodifiableCollection(members)); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append(FORMATTER.get().format(date)).append(' ').append(members); return sb.toString(); } } }