package ibis.ipl.registry.central;
import ibis.ipl.impl.IbisIdentifier;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.io.Serializable;
public final class Event implements Serializable, Comparable<Event> {
private static final long serialVersionUID = 1L;
// event types
public static final int JOIN = 0;
public static final int LEAVE = 1;
public static final int DIED = 2;
public static final int SIGNAL = 3;
public static final int ELECT = 4;
public static final int UN_ELECT = 5;
public static final int POOL_CLOSED = 6;
public static final int POOL_TERMINATED = 7;
public static final int NR_OF_TYPES = 8;
private final int time;
private final int type;
private final String description;
// single ibis field, denoting which ibis this event is about
private final IbisIdentifier ibis;
// multiple ibisses field (only used for destinations in signals)
private final IbisIdentifier[] destinations;
public Event(int time, int type, String description, IbisIdentifier ibis,
IbisIdentifier... destinations) {
this.time = time;
this.type = type;
this.ibis = ibis;
this.destinations = destinations.clone();
if (description == null) {
this.description = "";
} else {
this.description = description;
}
if (type != SIGNAL && destinations.length != 0) {
throw new Error("only the signal type event can have a destination");
}
}
public Event(DataInput in) throws IOException {
time = in.readInt();
type = in.readInt();
description = in.readUTF();
if (in.readBoolean()) {
ibis = new IbisIdentifier(in);
} else {
ibis = null;
}
destinations = new IbisIdentifier[in.readInt()];
for (int i = 0; i < destinations.length; i++) {
destinations[i] = new IbisIdentifier(in);
}
}
public void writeTo(DataOutput out) throws IOException {
out.writeInt(time);
out.writeInt(type);
out.writeUTF(description);
if (ibis != null) {
out.writeBoolean(true);
ibis.writeTo(out);
} else {
out.writeBoolean(false);
}
out.writeInt(destinations.length);
for (int i = 0; i < destinations.length; i++) {
destinations[i].writeTo(out);
}
}
public int getTime() {
return time;
}
public String getDescription() {
return description;
}
public IbisIdentifier getIbis() {
return ibis;
}
public IbisIdentifier[] getDestinations() {
return destinations.clone();
}
public int getType() {
return type;
}
private String typeString() {
switch (type) {
case JOIN:
return "JOIN";
case LEAVE:
return "LEAVE";
case DIED:
return "DIED";
case SIGNAL:
return "SIGNAL";
case ELECT:
return "ELECT";
case UN_ELECT:
return "UN_ELECT";
case POOL_CLOSED:
return "POOL_CLOSED";
case POOL_TERMINATED:
return "POOL_TERMINATED";
default:
return "UNKNOWN";
}
}
public String toString() {
return typeString() + "@" + time;
}
public int compareTo(Event other) {
return time - other.time;
}
}