package org.zstack.network.service.portforwarding; import org.zstack.header.exception.CloudRuntimeException; import java.util.HashMap; import java.util.Map; /** */ public enum PortForwardingRuleState { Enabled, Disabled; static { Enabled.transactions( new Transaction(PortForwardingRuleStateEvent.disable, PortForwardingRuleState.Disabled), new Transaction(PortForwardingRuleStateEvent.enable, PortForwardingRuleState.Enabled) ); Disabled.transactions( new Transaction(PortForwardingRuleStateEvent.disable, PortForwardingRuleState.Disabled), new Transaction(PortForwardingRuleStateEvent.enable, PortForwardingRuleState.Enabled) ); } private static class Transaction { PortForwardingRuleStateEvent event; PortForwardingRuleState nextState; private Transaction(PortForwardingRuleStateEvent event, PortForwardingRuleState nextState) { this.event = event; this.nextState = nextState; } } private void transactions(Transaction...transactions) { for (Transaction tran : transactions) { transactionMap.put(tran.event, tran); } } private Map<PortForwardingRuleStateEvent, Transaction> transactionMap = new HashMap<PortForwardingRuleStateEvent, Transaction>(); public PortForwardingRuleState nextState(PortForwardingRuleStateEvent event) { Transaction tran = transactionMap.get(event); if (tran == null) { throw new CloudRuntimeException(String.format("cannot find next state for current state[%s] on transaction event[%s]", this, event)); } return tran.nextState; } }