package org.zstack.header.storage.snapshot; import org.zstack.header.exception.CloudRuntimeException; import java.util.HashMap; import java.util.Map; /** */ public enum VolumeSnapshotStatus { Creating, Ready, Deleting; static { Creating.transactions( new Transaction(StatusEvent.ready, VolumeSnapshotStatus.Ready), new Transaction(StatusEvent.delete, VolumeSnapshotStatus.Deleting) ); Ready.transactions( new Transaction(StatusEvent.ready, VolumeSnapshotStatus.Ready), new Transaction(StatusEvent.delete, VolumeSnapshotStatus.Deleting) ); Deleting.transactions( new Transaction(StatusEvent.ready, VolumeSnapshotStatus.Ready) ); } public enum StatusEvent { delete, ready, } private static class Transaction { StatusEvent event; VolumeSnapshotStatus nextStatus; private Transaction(StatusEvent event, VolumeSnapshotStatus nextStatus) { this.event = event; this.nextStatus = nextStatus; } } private Map<StatusEvent, Transaction> transactionMap = new HashMap<>(); private void transactions(Transaction... transactions) { for (Transaction tran : transactions) { transactionMap.put(tran.event, tran); } } public VolumeSnapshotStatus nextState(StatusEvent 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; } }