package ibis.ipl.impl.multi;
import ibis.ipl.IbisIdentifier;
import ibis.ipl.RegistryEventHandler;
import java.io.IOException;
public class MultiRegistryEventHandler implements RegistryEventHandler {
private final RegistryEventHandler subHandler;
private final MultiIbis ibis;
private MultiRegistry registry;
private String ibisName;
public MultiRegistryEventHandler(MultiIbis ibis,
RegistryEventHandler subHandler) {
this.ibis = ibis;
this.subHandler = subHandler;
}
public synchronized void died(IbisIdentifier corpse) {
while (registry == null) {
try {
wait();
} catch (InterruptedException e) {
// Ignored
}
}
try {
MultiIbisIdentifier id = ibis.mapIdentifier(corpse, ibisName);
if (!registry.died.containsKey(id)) {
registry.died.put(id, id);
subHandler.died(id);
}
} catch (IOException e) {
// TODO What the hell to do.
}
}
public synchronized void electionResult(String electionName,
IbisIdentifier winner) {
while (registry == null) {
try {
wait();
} catch (InterruptedException e) {
// Ignored
}
}
try {
MultiIbisIdentifier id = ibis.mapIdentifier(winner, ibisName);
if (!registry.elected.containsKey(electionName)) {
registry.elected.put(electionName, id);
subHandler.electionResult(electionName, id);
} else {
MultiIbisIdentifier oldWinner = registry.elected
.get(electionName);
if (!oldWinner.equals(id)) {
registry.elected.put(electionName, id);
subHandler.electionResult(electionName, id);
}
}
} catch (IOException e) {
// TODO What the hell to do
}
}
public void gotSignal(String signal, IbisIdentifier source) {
subHandler.gotSignal(signal, source);
}
public synchronized void joined(IbisIdentifier joinedIbis) {
while (registry == null) {
try {
wait();
} catch (InterruptedException e) {
// Ignored
}
}
try {
MultiIbisIdentifier id = ibis.mapIdentifier(joinedIbis, ibisName);
if (!registry.joined.containsKey(id)) {
registry.joined.put(id, id);
subHandler.joined(id);
}
} catch (IOException e) {
// TODO What the hell to do here?
}
}
public synchronized void left(IbisIdentifier leftIbis) {
while (registry == null) {
try {
wait();
} catch (InterruptedException e) {
// Ignored
}
}
try {
MultiIbisIdentifier id = ibis.mapIdentifier(leftIbis, ibisName);
if (!registry.left.containsKey(id)) {
registry.left.put(id, id);
subHandler.left(id);
}
} catch (IOException e) {
// TODO What the hell to do here?
}
}
public synchronized void setName(String ibisName) {
this.ibisName = ibisName;
}
public synchronized void setRegistry(MultiRegistry registry) {
this.registry = (MultiRegistry) ibis.registry();
notifyAll();
}
public void poolClosed() {
// FIXME: implement
}
public void poolTerminated(IbisIdentifier source) {
// FIXME: implement
}
}