package ibis.ipl.registry.central;
import ibis.ipl.impl.IbisIdentifier;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.List;
import java.util.Random;
public final class ListMemberSet implements MemberSet {
private final ArrayList<Member> list;
private final Random random;
public ListMemberSet() {
list = new ArrayList<Member>();
random = new Random();
}
public int size() {
return list.size();
}
public void add(Member member) {
list.add(member);
}
public Member remove(IbisIdentifier identifier) {
String ID = identifier.getID();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getID().equals(ID)) {
Member result = list.remove(i);
return result;
}
}
return null;
}
public boolean contains(IbisIdentifier identifier) {
String ID = identifier.getID();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getID().equals(ID)) {
return true;
}
}
return false;
}
public boolean contains(Member member) {
return contains(member.getIbis());
}
public Member get(IbisIdentifier identifier) {
String ID = identifier.getID();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getID().equals(ID)) {
return list.get(i);
}
}
return null;
}
public Member get(String name) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getIbis().name().equals(name)) {
return list.get(i);
}
}
return null;
}
public int getMinimumTime() {
if (list.isEmpty()) {
return -1;
}
int minimum = list.get(0).getCurrentTime();
for (int i = 0; i < list.size(); i++) {
if (list.get(i).getCurrentTime() < minimum) {
minimum = list.get(i).getCurrentTime();
}
}
return minimum;
}
public Member getLeastRecentlySeen() {
if (list.isEmpty()) {
return null;
}
Member oldest = list.get(0);
for (int i = 1; i < list.size(); i++) {
if (list.get(i).getTime() < oldest.getTime()) {
oldest = list.get(i);
}
}
return oldest;
}
public Member get(int index) {
if (index >= list.size()) {
return null;
}
return list.get(index);
}
public Member getRandom() {
if (list.isEmpty()) {
return null;
}
return list.get(random.nextInt(size()));
}
public Member[] getRandom(int size) {
ArrayList<Member> result = new ArrayList<Member>();
BitSet added = new BitSet();
if (size > list.size()) {
size = list.size();
}
while (result.size() < size) {
int next = random.nextInt(list.size());
if (!added.get(next)) {
// not added yet
result.add(list.get(next));
// remember we already added this member.
added.set(next);
}
}
return result.toArray(new Member[0]);
}
public Member[] asArray() {
return list.toArray(new Member[0]);
}
public void init(DataInputStream in) throws IOException {
int nrOfMembers = in.readInt();
if (nrOfMembers < 0) {
throw new IOException("negative list size recieved" + nrOfMembers);
}
for (int i = 0; i < nrOfMembers; i++) {
list.add(new Member(in));
}
}
public void writeTo(DataOutputStream out) throws IOException {
out.writeInt(list.size());
for (Member member: list) {
member.writeTo(out);
}
}
public List<Event> getJoinEvents() {
ArrayList<Event> result = new ArrayList<Event>();
for(Member member: list) {
result.add(member.getEvent());
}
return result;
}
/**
* List does not have parents/children
*/
public Member[] getChildren(IbisIdentifier ibis) {
return new Member[0];
}
public Member[] getRootChildren() {
return asArray();
}
}