package org.zstack.header.host;
import org.zstack.header.exception.CloudRuntimeException;
import java.util.HashMap;
import java.util.Map;
public enum HostStatus {
Connecting,
Connected,
Disconnected;
static {
Connecting.transactions(
new Transaction(HostStatusEvent.connecting, Connecting),
new Transaction(HostStatusEvent.connected, Connected),
new Transaction(HostStatusEvent.disconnected, Disconnected)
);
Connected.transactions(
new Transaction(HostStatusEvent.connecting, Connecting),
new Transaction(HostStatusEvent.disconnected, Disconnected),
new Transaction(HostStatusEvent.connected, Connected)
);
Disconnected.transactions(
new Transaction(HostStatusEvent.connecting, Connecting),
new Transaction(HostStatusEvent.connected, Connected),
new Transaction(HostStatusEvent.disconnected, Disconnected)
);
}
private static class Transaction {
HostStatusEvent event;
HostStatus nextStatus;
private Transaction(HostStatusEvent event, HostStatus nextStatus) {
this.event = event;
this.nextStatus = nextStatus;
}
}
private void transactions(Transaction... transactions) {
for (Transaction tran : transactions) {
transactionMap.put(tran.event, tran);
}
}
private Map<HostStatusEvent, Transaction> transactionMap = new HashMap<HostStatusEvent, Transaction>();
public HostStatus nextStatus(HostStatusEvent event) {
Transaction tran = transactionMap.get(event);
if (tran == null) {
throw new CloudRuntimeException(String.format("cannot find next status for current status[%s] on transaction event[%s]",
this, event));
}
return tran.nextStatus;
}
}