Domanda

Apache Commons SCXML , e vorrei sapere se è possibile dire la macchina a stati (SCXMLExecutor) per passare a un determinato stato.

Non è possibile utilizzare l'attributo initialstate, perché voglio la macchina dello stato per recuperare (vale a dire da interruzioni di corrente), e l'unica cosa che ho è l'ultimo stato. Ecco perché ho pensato di raccontare la macchina dello Stato per fare un salto diretto ad esso.

È stato utile?

Soluzione

Nel caso generale si tratta di una pessima idea per passare a uno stato senza lo stato della macchina di essere "consapevole" di essa, perché ci potrebbero essere i presupposti per l'esecuzione di un particolare stato che non sono soddisfatti (che sarebbe, se hai raggiunto lo stato del) modo "normale". Un'idea migliore è quella di progettare la macchina a stati di una capacità "restart", realizzate come un evento di input "restart" e gli stati e le transizioni necessarie per gestirlo.

Altri suggerimenti

Questa è una vecchia questione, ma ho appena colpito questo e aveva bisogno di una risposta ad esso come bene e ho pensato che potrebbe aiutare gli altri a rispondere. Sto usando questo come parte di unit testing, dove è estremamente utile per ottenere solo a un particolare stato (io voglio essere sicuro che se in stato di A, se una sequenza di eventi accade, va a stato B - ed ancora va lì dopo ho armeggiare con il codice XML macchina a stati!)

Finalmente ho trovato questo codice in SCXMLTestHelper e ha funzionato. Basta chiamare con l'esecutore e lo Stato di destinazione.

public static void setCurrentState(SCXMLExecutor exec, final String id) throws IllegalArgumentException{
    try {
        exec.reset();
    } catch (ModelException me) {
        throw new IllegalArgumentException("Provided SCXMLExecutor "
                + "instance cannot be reset.");
    }
    TransitionTarget active = (TransitionTarget) exec.getStateMachine().
            getTargets().get(id);
    if (active == null) {
        throw new IllegalArgumentException("No target with id '" + id
                + "' present in state machine.");
    }
    Set current = exec.getCurrentStatus().getStates();
    current.clear();
    current.add(active);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top